Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#泛型_C#_Generics - Fatal编程技术网

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);