2014-03-05 42 views
1

我正在使用泛型方法來反序列化xml文檔取決於包含。它試圖對所有可能的情況進行反序列化。命名空間名稱'P'無法找到(您是否缺少使用指令或程序集引用?)

這裏我的代碼片段:

private static Dictionary<Type, byte> getMessageDictionary() { 
    Dictionary<Type, byte> typesIO = new Dictionary<Type, byte>(); 
    typesIO.Add(typeof (Type1), 1); 
    typesIO.Add(typeof (Type2), 11); 
    typesIO.Add(typeof (Type3), 12); 

    return typesIO; 
} 

public static object GetContainer(XmlDocument xd) { 
    foreach(KeyValuePair<Type, byte> item in getMessageDictionary()) { 
     try { 
      Type p = item.Key; 
      var z = Utils.XmlDeserialize<p> (xd.OuterXml); 

      return z; 
     } catch { 
      continue; 
     } 
    } 
    return null; 
} 

但是編譯器說的類型或命名空間名稱p找不到。我錯過using指令或程序集引用嗎?什麼地方出了錯?

+2

在一個類型的預期背景下,不能使用類型Type'的'的對象。在編譯時必須知道泛型類/方法的類型參數。 – knittl

回答

5

p是一個變量,其中包含對Type實例的引用,但您試圖將其用作類型參數。

做你想做什麼,你需要使用反射來調用方法:

Type p = item.Key; 
var method = typeof(Utils).GetMethod("XmlDeserialize").MakeGenericMethod(p); 
var z = (XmlDocument)method.Invoke(null, new object[] { xd.OuterXml }); 
+0

我沒有任何MakeGenericType(p),我有MakeGenericMethod(),但是當我使用它時,它會拋出一個InvalidOperationException,並且消息綁定操作不能在包含泛型參數爲true的類型或方法上執行......任何消息?謝謝你的回覆 – MirlvsMaximvs

+0

@Mirlo - 是的你是對的,它應該是'MakeGenericMethod'。您傳遞給「MakeGenericMethod」的「p」類型是什麼?如果is包含泛型參數(例如'typeof(IEnumerable <>)'),那麼你會得到你描述的異常。在嘗試調用'MakeGenericMethod'之前,您需要先將類型參數提供給'p'。 – Lee

+0

好的,最後我用了類似的東西,但答案非常有用,謝謝。 – MirlvsMaximvs

相關問題