我正在尝试创建一个泛型类的实例,但在运行时之前不知道需要将其转换为什么类型。我编写了以下代码:
Type pType = propertyInfo.GetType();
ObjectComparer<pType> oc = new ObjectComparer<pType>();
希望这能让你了解我试图做什么,但它无法编译,只会显示:
"找不到pType类型或名称空间"。
有没有更简单的方法来实现这一点?
谢谢
Gavin
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);
看起来我太慢了。