gpt4 book ai didi

C#泛型

转载 作者:太空狗 更新时间:2023-10-29 22:25:07 25 4
gpt4 key购买 nike

我正在尝试创建一个通用类的实例,但直到运行时才知道将其转换为什么类型。我写了下面的代码

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

希望这能让您了解我正在尝试做什么,但是它不会编译它只是说

“找不到类型或命名空间 pType”。

有什么简单的方法可以做到这一点吗?

谢谢

加文

最佳答案

Type type = typeof(ObjectComparer<>).MakeGenericType(pType);
object obj = Activator.CreateInstance(type);

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


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

interface ISomeInterface {
object SomeMethod(object value);
}
interface ISomeInterface<T> : ISomeInterface {
T SomeMethod(T value);
}

然后您可以通过非通用 ISomeInterface 调用,而无需跳过任何额外的环节。

下面使用 MakeGenericMethod 的示例 - 但非通用基础接口(interface)会更有效:

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

关于C#泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/968801/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com