将类型转换为泛型类定义

本文关键字:定义 泛型类 类型转换 | 更新日期: 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);
}

然而,我不建议这样做,而是建议重新设计您的解决方案。使用反射意味着您错过了该语言提供的所有可爱的编译时安全性。这通常会导致代码变得更脆弱、可维护性更低。