gpt4 book ai didi

C# 如何使用类型为 "Type"的对象初始化泛型类

转载 作者:行者123 更新时间:2023-11-30 13:26:41 26 4
gpt4 key购买 nike

我最近遇到了这个问题。

doSomething(typeof(int));
doSomething(typeof(MyClassA));
doSomething(typeof(MyClassB));

public void doSomething(Type _type)
{
var myGenObj = new MyGenericClass<_type>(); // Error. Really I'd want MyGenericClass<int>, MyGenericClass<MyClassA>, etc depending on what's passed in.
myGenObj.doSomeGenStuff();
// more stuff...

}

我认为这可以以某种方式通过反射来完成。可能有更简单的方法。我对 Type 与 Classes 在幕后的工作方式有些困惑。无论如何,感谢您的帮助。

谢谢。

最佳答案

你想要Type.MakeGenericType然后是 Activator.CreateInstance... 但是在新创建的对象上调用方法将很棘手。理想情况下,您可以拥有一个包含这些成员的非泛型基类或接口(interface):

public interface IFoo
{
void CallSomeMethod();
}

public class MyGenericClass<T> : IFoo
{
...
}

// Names changed to be more conventional
public void DoSomething(Type type)
{
var genericType = typeof(MyGenericClass<>).MakeGenericType(type);
var instance = (IFoo) Activator.CreateInstance(genericType);
instance.CallSomeMethod();
}

如果您确实需要调用一个依赖于类型参数的方法,您需要使用反射,使用动态 可以简化基于反射的代码。

编辑:正如 cdhowie 所说,如果您实际上总是确实在编译时知道类型,您可以使用通用方法,这将使事情变得更加简单。然后,您可以调用这样的方法:

DoSomething<int>();
DoSomething<MyClassA>();
DoSomething<MyClassB>();

关于C# 如何使用类型为 "Type"的对象初始化泛型类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19059272/

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