C#泛型

5

我正在尝试创建一个泛型类的实例,但在运行时之前不知道需要将其转换为什么类型。我编写了以下代码:

        Type pType = propertyInfo.GetType();
        ObjectComparer<pType> oc = new  ObjectComparer<pType>();

希望这能让你了解我试图做什么,但它无法编译,只会显示:

"找不到pType类型或名称空间"。

有没有更简单的方法来实现这一点?

谢谢

Gavin

2个回答

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

我想问一下,这段代码是否可以将类实例化为一个对象?如果是的话,我该如何将其转换为类的类型,以便调用它的方法? - Gavin
你不能(方便地)这样做-因此我建议你尝试将其转换为非泛型类型(也许将你的方法放在那里?)。也许你可以调用一个泛型方法并在其中完成工作?(我会添加一个例子。) - Marc Gravell

1

类似这样:

Type someType = typeof(ObjectComparer<>);
Type toConstruct = someType.MakeGenericType (pType);

object o = Activator.CreateInstance (toConstruct);

看起来我太慢了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接