我如何知道对象的类型并导致它?

时间:2010-09-25 08:50:49

标签: c# wpf

Paragraph p = new Paragraph();

void Function(var inline)
{
    var r = (inline);
    string rSer = XamlWriter.Save(r);
    var inl1 = XamlReader.Parse(rSer);
    p.Inlines.Add(inl1); // error The best overloaded method match for System.Windows.Documents.InlineCollection.Add(System.Windows.UIElement)' has some invalid arguments    
}

内联类型可以是System.Windows.Documents.Run或System.Windows.Documents.Span。

我如何知道内联的类型并导致它?

我需要这样的东西:

Type t = Type.GetType(inline.GetType().ToString()); // results in t == null 
p.Inlines.Add(inline as t);

2 个答案:

答案 0 :(得分:2)

最简单的测试和演员。

if (inl1 is Run)
    p.Inlines.Add((Run)inl1);
else if (inl1 is Span)
    p.Inlines.Add((Span)inl1);

修改
我想我理解你的思考过程。如果您的对象被转换为内联并不重要。它的基础类型仍然是你所期望的。这是为了编译器的好处,知道代表您调用哪些方法。使用XamlReader.Parse()时,它会将适当输入的项目作为object引用返回。您要添加的InlineCollection不期望object,这就是失败的原因。由于类型实际上是RunSpan,它们都继承自Inline(集合所期望的),因此您需要使用适当类型的变量。

考虑到你的心态,我认为你的功能可以简化为:

void Function(Inline inline)
{
    p.Inlines.Add(inline);
}

答案 1 :(得分:1)

由于System.Windows.Documents.Run和System.Windows.Documents.Span都派生自System.Windows.Documents.Inline,因此它可以简单如下:

// untested
void Function(Inline inline1)
{
    string rSer = XamlWriter.Save(inline1);
    var inline2 = XamlReader.Parse(rSer) as Inline;
    p.Inlines.Add(inline2); 
}