2011-11-24 127 views
0

我得到了下面的代碼創建我的課:提供的類型來實例化一個泛型類

public class GenericObject<T> 
{ 
    [...] 

    public GenericObject(object source, string propertyName) 
    { 
     [...] 
    } 
} 

,然後我想創建我的類的實例。這裏是循環我有:

 foreach (PropertyInfo pi in container.GetType().GetProperties()) 
     { 
       //var type = pi.PropertyType; 
       GenericObject<pi.PropertyType> p = new GenericObject<pi.PropertyType>(container, pi.Name); 
     } 

編譯器告訴我,「P1」是不是一個命名空間(???) 我這個代碼的嘗試:

Type type = pi.PropertyType; 
GenericObject<type> p = new GenericObject<type>(container, pi.Name); 

,但我得到了同樣的錯誤('類型'不是一個命名空間) 我該怎麼辦? thx提前尋求幫助

+1

從你的代碼(例如'PrimitivePropertyProxy'和你在哪裏使用'GenericObject')中不是很清楚,但是你遇到的問題是'pi.PropertyType'一個**變量**,而不是一個**類型**。 –

+0

編輯我的問題! –

回答

1

你的問題是,pi.PropertyType變量包含代表一個類型,而不是一個自身的類。

泛型期望類型,而不是變量。您可以根據Jakub的答案動態創建類型,但我不確定那是您想要或需要的。


說實話,我不知道您的泛型類如何更好不僅僅是有一個持有object秒。既然你打算用反射來創建這個泛型類,那麼你將不會獲得通常使用泛型的類型安全。

4

通過將變量傳遞給<>,您無法在運行時創建動態類型。

您需要致電MakeGenericType並在那裏提供您的通用類型。

下面是一個例子

Type d1 = typeof(List<>);  
Type[] typeArgs = { typeof(string) };  
Type makeme = d1.MakeGenericType(typeArgs); 

object o = Activator.CreateInstance(makeme);  
List<string> itsMe = o as List<string>;  
Console.WriteLine((itsMe == null) ? "Failed" : "Succeeded"); 
+0

我不明白爲什麼有兩種類型可以調用MakeGenericType。在我的例子中,「pi.PropertyType」只能是類型Int32,String,Boolean和Double,但是第二種類型使用的是什麼? (列表之一) –

+0

我想我明白了,但我仍然不知道如何在我的行中使用它:GenericObject p = new GenericObject (container,pi.Name); 我應該把什麼「???」 ? –

0

萬一有人得到了完全相同的問題有一天,這裏是解決方案:

 foreach (PropertyInfo pi in container.GetType().GetProperties()) 
     { 
       Type generic = typeof(GenericObject<>); 
       Type[] typeArgs = { pi.PropertyType}; 
       Type constructed = generic.MakeGenericType(typeArgs); 
       object[] args = new object[] { container, pi.Name }; 
       var p = Activator.CreateInstance(constructed, args); 
     } 

我們可以「近似」說,這一點,我想做什麼等價的:

GenericObject<pi.PropertyType> p = new GenericObject<pi.PropertyType>(container, pi.Name); 

(可以這麼說)