2010-09-25 48 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

相關問題