C#泛型
我试图创建泛型类的实例,但不知道在运行时之前将其转换为什么类型。我已经编写了以下代码C#泛型,c#,generics,C#,Generics,我试图创建泛型类的实例,但不知道在运行时之前将其转换为什么类型。我已经编写了以下代码 Type pType = propertyInfo.GetType(); ObjectComparer<pType> oc = new ObjectComparer<pType>(); Type pType=propertyInfo.GetType(); ObjectComparer oc=新建ObjectComparer(); 希望这能给你一个想法
Type pType = propertyInfo.GetType();
ObjectComparer<pType> oc = new ObjectComparer<pType>();
Type pType=propertyInfo.GetType();
ObjectComparer oc=新建ObjectComparer();
希望这能给你一个想法,我想做什么,但它不会编译它只是说
“找不到类型或命名空间pType”
有什么简单的方法可以做到这一点吗
谢谢
加文
然后,您可以通过非通用的接口调用,而无需跳过任何额外的环
下面使用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);
}
}
类程序{
静态void Main(){
int i=123;
typeof(Program).GetMethod(“Foo”,
BindingFlags.Static | BindingFlags.NonPublic)
.MakeGenericMethod(i.GetType())
.Invoke(null,新对象[]{i});
}
静态void Foo(T值){
ObjectComparer=新建ObjectComparer();
比较器条(值);
}
}
类对象比较器{
公共空栏(T值){
Console.WriteLine(typeof(T).Name+“=”+值);
}
}
类似这样的内容:
Type someType = typeof(ObjectComparer<>);
Type toConstruct = someType.MakeGenericType (pType);
object o = Activator.CreateInstance (toConstruct);
Type someType=typeof(ObjectComparer);
Type toConstruct=someType.MakeGenericType(pType);
对象o=Activator.CreateInstance(toConstruct);
似乎我的速度太慢了。我认为代码将类的一个实例作为对象获取,这对吗?如果是这样的话,我将如何将它转换为类的类型,以便调用它的方法?谢谢你不能(很方便)——因此我对可能转换为非泛型类型(可能将你的方法放在那里?)发表了评论。你也许可以调用一个泛型方法并在那里进行工作?(我将添加一个示例)。
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);