2014-02-20 41 views
0

我正在處理大量的FieldInfo信息,我想爲某些類型的數據添加異常來處理它們的不同(爲了製作一個整潔的輸出字符串),但我可以沒有找到一種方法將對象投射到列表中,以便我可以從中得到計數。將一個未知類型的列表投射到一個通用列表類型

我的代碼:

string str = ""; 
string value = ""; 

foreach (FieldInfo fieldInfo in fieldInfos) 
{ 
    if (fieldInfo.Name == "Sprite" || fieldInfo.Name == "Background") 
    { 
     value = "Unreadable"; 
    } 
    else if (fieldInfo.GetValue(type) == null) 
    { 
     value = "Null"; 
    } 
    else 
    { 
     switch (fieldInfo.GetValue(type).GetType().Name) 
     { 
      default: 
       value = fieldInfo.GetValue(type).ToString(); 
       break; 
      case "Color": 
       value = ((Color)fieldInfo.GetValue(type)).Name; 
       break; 
      case "List`1": 
       value = (((System.Collections.Generic.List<>)fieldInfo.GetValue(type)).Count - 1).ToString(); 
       break; 
     } 
    } 

    str += "  " + fieldInfo.Name + ": " + value + Environment.NewLine; 
} 
return str; 

回答

3

丟給非通用ICollection代替:

(((System.Collections.ICollection)fieldInfo.GetValue(type)).Count - 1).ToString(); 

它會給你訪問Count財產。

+2

感謝它的工作。我會盡我所能接受你的答案! – user1763295

+0

@ user1763295如果它工作..你現在爲什麼不能接受它作爲答案? – ElectricRouge

+2

@ElectricRouge問題發佈後,您必須等待15分鐘才能接受答案。 – MarcinJuraszek

1

如果你只是之後的項目的數量,然後只需使用非通用IListList<>還實現了:

case "List`1": 
    value = (((System.Collections.IList)fieldInfo.GetValue(type)).Count - 1).ToString(); 
    break; 

你可以通過改變default子句此支持任何容器中,加入一定的靈活性:

default: 
if (typeof(System.Collections.ICollection).IsAssignableFrom(fieldInfo.GetValue(type).GetType()) 
    value = (((System.Collections.ICollection)fieldInfo.GetValue(type)).Count - 1).ToString(); 
    else 
    value = fieldInfo.GetValue(type).ToString(); 
    break; 

現在你會處理的集合,如Dictionary<>LinkedList<>以及List<>

+1

你的意思是'IList',不是嗎? – MarcinJuraszek

+0

@MarcinJuraszek - Doh,是的!謝謝。 – Sean

相關問題