C#泛型

Gav*_*vin 5 c# generics

我正在尝试创建泛型类的实例,而不知道在运行时将其强制转换为什么类型.我写了以下代码

        Type pType = propertyInfo.GetType();
        ObjectComparer<pType> oc = new  ObjectComparer<pType>();
Run Code Online (Sandbox Code Playgroud)

希望这可以让你知道我正在尝试做什么,但它不会编译它只是说

"无法找到类型或命名空间pType".

这有什么简单的方法吗?

谢谢

加文

Mar*_*ell 10

Type type = typeof(ObjectComparer<>).MakeGenericType(pType);
object obj = Activator.CreateInstance(type);
Run Code Online (Sandbox Code Playgroud)

但是,除非您转换为非泛型接口(IComparer可能),否则您将失去将其用作泛型类型的能力.


这里最常见的答案是非泛型基类/接口:

interface ISomeInterface {
    object SomeMethod(object value);
}
interface ISomeInterface<T> : ISomeInterface {
    T SomeMethod(T value);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过非泛型调用,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);
    }
}
Run Code Online (Sandbox Code Playgroud)