将类型转换为通用类定义

时间:2012-02-06 16:42:32

标签: c# .net

我想将System.Type转换为Generic Type定义,因此我可以使用它来调用Generic方法。基本上与typeof相反。

示例(我使用“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是一个由许多其他类引用的类。如果我愿意使它成为通用,这将意味着代码的许多其他部分将改变,这是我不想要的。我正在编写一个框架,所以我希望框架能够输入一次类型,开发人员只需使用提供的函数,而不必在每次尝试调用方法时都处理类型。

3 个答案:

答案 0 :(得分:6)

这是不可能的,因为在运行时设置了SettingsType并且编译了<>之间的代码。

您可以像这样创建类型的实例:

var type = Type.GetType(SettingsType);
var inst = Activator.CreateInstance(type);

并将inst转换为接口或基类。

由于您使用的是静态类,因此富人的答案会更好。

答案 1 :(得分:4)

这根本不可能 泛型形成编译时类型;您无法从仅在运行时知道的类型创建编译时类型。

相反,您需要使用反射,或使用不同的设计(例如,非泛型方法)。

答案 2 :(得分:3)

要实现这一目标,您需要使用反射:

public void MyFunction() {
  var method = typeof(MyStaticClass).GetMethod("GetData").MakeGenericMethod(SettingsType);
  method.Invoke(null, null);
}

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

相关问题