2009-06-25 94 views
2

我認爲這個問題可以使用反射(我不太確定的技術)來排序。如何確定什麼對象[]作爲參數傳遞包含?

我的代碼正在接收一些已在運行時序列化爲XML的代碼對象。當我收到它並對其進行反序列化時,一個字段導致了一些麻煩。

沒有可以包含以下數據類的組合(爲了清楚而簡化)一個字段:

class KeyValuePairType 
{ 
    public string Key; 
    public string Value; 
} 

class KeyValueListPair 
{ 
    public string Key; 
    public string[] Value; 
} 

我接收到這些我的代碼作爲對象[]和我需要確定在運行時什麼這恰恰包含這樣我可以調用一個本地對象的接口,它需要 KeyValuePairType []和KeyValueListPair []作爲參數,例如

public DoSomeWork(KeyValuePairType[] data1, KeyValueListPair[] data2) 

我有以下的情況下,以應付:

對象[]包含:

  1. 沒有在這種情況下,我請 DoSomeWork(NULL,NULL);

  2. KeyValuePairType的陣列只, 在這種情況下我請 DoSomeWork(KeyValuePairType [], NULL);

  3. KeyValueListPair的陣列只, 在這種情況下我請 DoSomework(NULL, KeyValueListPair []);

  4. 或每個的陣列,在這種情況下我 調用DoSomework(KeyValuePairType [], KeyValueListPair []);

任何想法都歡迎。

謝謝

事實證明,所述對象數組包含離散對象的隨機序列。最初,我被引導到相信它可能是這些對象的一系列分立和數組。

因爲這是LINQ聲明將涵蓋所有可能性。

我可以對那些回答的人表示非常感謝。我已經爲那些回答LINQ聲明的人發佈了+1。

回答

5

假設你已經有LINQ提供給你...

public void Foo(object[] values) 
{ 
    var pairs = values.OfType<KeyValuePairType>().ToArray(); 
    var lists = values.OfType<KeyValueListPair>().ToArray(); 

    pairs = pairs.Length == 0 ? null : pairs; 
    lists = lists.Length == 0 ? null : lists; 

    DoSomeWork(pairs, lists); 
} 
+0

據我瞭解的問題, 「值」 可以包含*陣列*的KeyValuePairType或KeyValueListPair而不是簡單的元素。 – 2009-06-25 17:03:45

+0

這是可能的 - 這不是很清楚。如果是這樣,我們是否打算多次撥打DoSomeWork? OP,請澄清! – 2009-06-25 18:47:49

0

它在某種程度上取決於如何處理各個元素,但一般而言,isas關鍵字應該適用於檢查object []數組中的單個對象,並將它們分配給相應的輸出。

1

可以在C#3做到這一點使用LINQ,像這樣:

void HandleThings(params object[] values) { 
    var pairTypes = values.OfType<KeyValuePairType>().ToArray(); 
    var listPairs = values.OfType<KeyValueListPair>().ToArray(); 

    DoSomeWork(pairTypes.Any() ? pairTypes : null, listPairs.Any() ? listPairs : null); 
} 

您可以通過.Length > 0更換.Any(),在簡潔的成本,使其一點點更快。

-2

確保object []不爲空並且長度大於1後,您可以在數組中的對象上調用GetType。

objectArray[0].GetType().FullName 

將返回

"Namespace.KeyValuePairType" 

"Namespace.KeyValueListPair" 
1

如何:

object[] objects = GetObjects(); 

var pairs = objects.OfType<KeyValuePairType[]>().FirstOrDefault(); 
var lists = objects.OfType<KeyValueListPair[]>().FirstOrDefault(); 

DoSomeWork(pairs, lists); 
相關問題