2009-06-09 80 views
5

我想創建一個泛型類的實例,而不知道什麼類型將它轉換爲它,直到運行時。我已經寫了下面的代碼C#泛型

 Type pType = propertyInfo.GetType(); 
     ObjectComparer<pType> oc = new ObjectComparer<pType>(); 

希望,給你一個想法是什麼,我試圖做的,但它不會編譯它只是說

「的類型或命名空間PTYPE找不到」 。

有沒有簡單的方法來做到這一點?

感謝

加文

回答

10
Type type = typeof(ObjectComparer<>).MakeGenericType(pType); 
object obj = Activator.CreateInstance(type); 

但是,除非你施放到非通用接口(IComparer,也許),您將無法使用它作爲一個泛型類型的能力。


這裏最常見的回答是一個非通用基礎類/接口:

interface ISomeInterface { 
    object SomeMethod(object value); 
} 
interface ISomeInterface<T> : ISomeInterface { 
    T SomeMethod(T value); 
} 

然後,您可以通過非通用ISomeInterface調用,而不必通過任何額外的跳火圈。

實施例使用以下MakeGenericMethod - 但非通用基界面會更有效:

class Program { 
    static void Main() { 
     int i = 123; 
     typeof(Program).GetMethod("Foo", 
       BindingFlags.Static | BindingFlags.NonPublic) 
      .MakeGenericMethod(i.GetType()) 
      .Invoke(null, new object[] { i }); 
    } 
    static void Foo<T>(T value) { 
     ObjectComparer<T> comparer = new ObjectComparer<T>(); 
     comparer.Bar(value); 
    } 
} 
class ObjectComparer<T> { 
    public void Bar(T value) { 
     Console.WriteLine(typeof(T).Name + " = " + value); 
    } 
} 
+0

我是否正確地認爲代碼將我作爲類的一個實例?如果是這樣的話,我怎樣才能將它轉換爲類的類型,以便我可以調用它的方法? 謝謝 – Gavin 2009-06-09 08:25:43

1

像這樣:

Type someType = typeof(ObjectComparer<>); 
Type toConstruct = someType.MakeGenericType (pType); 

object o = Activator.CreateInstance (toConstruct); 

似乎我很慢。