【问题标题】:Using Type objects as Type Parameters for Generics in C#在 C# 中使用类型对象作为泛型的类型参数
【发布时间】:2009-09-23 16:14:56
【问题描述】:

在 C# 3.0 / .NET 3.5 的泛型构造中,我找不到使用一流类型对象(System.Type 实例)作为类型参数的方法。下面是我想做的一个简化示例:

public void test()
{
    Type someType = getSomeType(); // get some System.Type object

    MyGeneric<someType> obj = new MyGeneric<someType>();  // won't compile
}

有没有办法将 someType 对象用作泛型的类型参数?

【问题讨论】:

  • 我个人用的是Switch。这可能不适用于所有地方......我希望它可以像你的例子一样。

标签: c# generics types


【解决方案1】:

您可以动态创建该类型的实例:

public void test()
{
    Type someType = getSomeType(); // get some System.Type object
    Type openType = typeof(MyGeneric<>);
    Type actualType = openType.MakeGenericType(new Type[] { someType });
    object obj = Activator.CreateInstance(actualType);
}

但是您不能声明这种类型的变量,因为您不知道静态的实际类型。

【讨论】:

  • 如果有人通过这篇文章,在 C# 4.0 中 the dynamic keyword 允许您声明禁用编译时类型检查的变量。
  • @JacobBundgaard,是的,但这与 OP 的问题无关。当您在编译时不知道类型参数时,它不允许您创建泛型类型的实例。
  • 我不这么认为。动态声明将允许您调用通过反射创建的 MyGeneric 对象的方法,而对象声明则不允许。考虑 MyGeneric 有一个方法 MyMethod。那么这段代码将不起作用:object obj = Activator.CreateInstance(actualType); obj.MyMethod();,而这将:dynamic obj = Activator.CreateInstance(actualType); obj.MyMethod();
  • 很抱歉,我似乎在尝试解决 OP 的问题。四年后的现在,OP 可能已经过去了,而路过的人可能会从了解与该问题相关的新语言功能中受益。
【解决方案2】:

您试图在运行时确定您的类型参数。 .Net 泛型要求在编译时知道类型参数。除了打开类型之外,真的没有办法做到这一点。您也许可以通过反射获得该方法的句柄并调用它,但这很丑。

【讨论】:

  • +1 Thomas 展示了如何做到这一点,但您更好地解释了为什么需要反射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-05
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多