2010-09-25 42 views
-1
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); 
+1

'void Function(var inline)'不会编译,这会使您的问题变得模糊。 – 2010-09-25 09:12:25

+0

不好的问题,并给予负面的人试图帮助... – Aliostad 2010-09-25 09:48:30

+0

我会避免使用“内嵌作为吨”作为函数的参数,因为它可以返回null – Val 2010-09-25 12:05:59

回答

1

由于System.Windows.Documents.Run和System.Windows.Documents.Span从系统中获得两.Windows.Documents.Inline它可能很简单:

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

它的工作,但失去了物体的属性。 – Mediator 2010-09-25 10:01:23

+0

@simply,如果它的工作(即输出是正确的),那么属性都在那里。 – 2010-09-27 07:12:08

+0

是的,它的工作原理是,问题变成了朋友。为此http://stackoverflow.com/q/3793830/450466 – Mediator 2010-09-27 15:51:33

2

这将是最简单的只是测试和演员。

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

编辑:
我想我明白你的思维过程。如果您的对象被转换为Inline,则无关紧要。它的基础类型仍然是你期望的。这是为了让编译器知道代表你调用哪些方法。当您使用XamlReader.Parse()时,它将返回相应类型的项目作为object参考。您添加的InlineCollection不期望object,这就是它失败的原因。由于类型实际上是RunSpan,它们都从Inline(集合期望的)继承而来,因此您需要使用适当类型的变量。

与所有考虑到这一点了解你的心态,我觉得你的函数可以简单地降低:

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

我确实想避免 – Mediator 2010-09-25 10:01:46

相关问题