我想創建一個泛型類的實例,而不知道什麼類型將它轉換爲它,直到運行時。我已經寫了下面的代碼C#泛型
Type pType = propertyInfo.GetType();
ObjectComparer<pType> oc = new ObjectComparer<pType>();
希望,給你一個想法是什麼,我試圖做的,但它不會編譯它只是說
「的類型或命名空間PTYPE找不到」 。
有沒有簡單的方法來做到這一點?
感謝
加文
我想創建一個泛型類的實例,而不知道什麼類型將它轉換爲它,直到運行時。我已經寫了下面的代碼C#泛型
Type pType = propertyInfo.GetType();
ObjectComparer<pType> oc = new ObjectComparer<pType>();
希望,給你一個想法是什麼,我試圖做的,但它不會編譯它只是說
「的類型或命名空間PTYPE找不到」 。
有沒有簡單的方法來做到這一點?
感謝
加文
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);
}
}
像這樣:
Type someType = typeof(ObjectComparer<>);
Type toConstruct = someType.MakeGenericType (pType);
object o = Activator.CreateInstance (toConstruct);
似乎我很慢。
我是否正確地認爲代碼將我作爲類的一個實例?如果是這樣的話,我怎樣才能將它轉換爲類的類型,以便我可以調用它的方法? 謝謝 – Gavin 2009-06-09 08:25:43