【问题标题】:Generics in C# - how can I create an instance of a variable type with an argument? [duplicate]C# 中的泛型 - 如何使用参数创建变量类型的实例? [复制]
【发布时间】:2011-06-20 11:18:21
【问题描述】:

我有一个泛型类,我想用泛型类型实例化一个对象。我想为该类型的构造函数使用一个参数。

我的代码:

public class GenericClass<T> where T : Some_Base_Class, new()
{
    public static T SomeFunction(string s)
    {
        if (String.IsNullOrEmpty(s))
            return new T(some_param);
    }
}

我收到一个错误

new T(some_param)

'T': 创建变量实例时无法提供参数 输入

任何想法我该怎么做?

【问题讨论】:

  • this 是我能找到的最好的解决方法....
  • 你会经常这样做吗?什么版本的 C#?
  • 另一种方法是在Some_Base_Class上创建一个公共属性,然后您可以执行以下操作:new T() { SomeProperty = "value" }

标签: c# generics


【解决方案1】:

看看Activator.CreateInstance。例如:

var instance = Activator.CreateInstance(typeof(T), new object[] { null, null });

显然将nulls 替换为该类型的构造函数之一所期望的适当值。

如果您收到关于 cannot convert object to type T 的编译器错误,请包含 as T

var instance = Activator.CreateInstance(typeof(T), 
                  new object[] { null, null }) as T;

【讨论】:

  • 这是正确的方法,对。
  • 完美!非常感谢! :)
  • 注意var instance = Activator.CreateInstance(typeof(T), new object[] { null, null }) as T;中的as T
  • 只有当 T 不是值类型时才有效。例如,如果您需要将它与 SystemNumerics.Complex 一起使用,它是一个结构,则转换为 (T) 而不是使用 'as T'
  • 我喜欢整洁,所以你可以把它写成Activator.CreateInstance(typeof(T), options) as T 这样也行
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-18
相关资源
最近更新 更多