将类型转换为泛型类定义
本文关键字:定义 泛型类 类型转换 | 更新日期: 2023-09-27 18:22:36
我想将System.Type
转换为泛型类型定义,这样我就可以用它来调用泛型方法。基本上与CCD_ 2相反。
示例(我在需要真正解决方案的地方使用了"classof",这样你就可以看到我在哪里遇到了问题,因为classof不是一个真正的.NET方法):
public class BaseAppContext {
private Type settingsType;
public Type SettingsType
{
get { return this.settingsType; }
set { this.SettingsType = value; }
}
public void MyFunction() {
MyStaticClass.GetData<classof(this.SettingsType)>();
}
}
只是一些更多的信息,为什么我使用这种奇怪的方式来处理这个问题。BaseAppContext是一个被许多其他类引用的类。如果我将其设为Generic,这意味着代码的许多其他部分将发生更改,而我不希望这样。我正在写一个框架,所以我希望框架只输入一次类型,开发人员可以使用所提供的函数,而不必在每次尝试调用方法时处理类型。
这是不可能的,因为SettingsType
是在运行时设置的,并且<>
之间的代码是编译的。
您可以创建这样一个类型的实例:
var type = Type.GetType(SettingsType);
var inst = Activator.CreateInstance(type);
并将CCD_ 5强制转换为接口或基类。
由于您使用的是静态类,因此rich的答案更好。
这根本不可能
泛型形成编译时类型;不能从仅在运行时已知的类型创建编译时类型。
相反,您需要使用反射,或者使用不同的设计(例如,非通用方法)。
要实现这一点,您需要使用反射:
public void MyFunction() {
var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType);
method.Invoke(null, null);
}
然而,我不建议这样做,而是建议重新设计您的解决方案。使用反射意味着您错过了该语言提供的所有可爱的编译时安全性。这通常会导致代码变得更脆弱、可维护性更低。