奇怪的<t>激活者问题</t>

时间:2010-04-25 07:18:07

标签: c# .net winforms class

对不起,不久前我写了一段非常好的代码。而现在我正试着为一个新项目记住它。

我记得的一切就是它看起来像这样:

public static Create<T>() *something missing here* : *Something missing here*
{
     // add methods etc here. I also think I remember something like " Activator.CreateInstance" being used. But I'm not sure.
}

以前有人写过这样的代码吗?基本上它所做的是它创建了一个控件并将其传递回另一个项目。

谢谢 JT

2 个答案:

答案 0 :(得分:1)

可能看起来与此类似:

public static Create<T>() where T : new()
{
    return Activator.CreateInstance(typeof(T));
}

一些解释:

  • Activator.CreateInstance(typeof(T))创建T类型的对象。您可以选择将参数传递给被调用的构造函数(检查reference documentation for a parameter overview for Activator.CreateInstance),但由于这几乎适用于任何T,因此提供构造函数参数太具体而且不是一个好主意。

  • 这就是为什么需要where T : new()的原因。这会对类型参数new()设置T约束。这意味着此方法仅对提供无参数(“默认”)构造函数的类型T有效。


P.S。:请注意,当您需要处理的只有Activator.CreateInstance时,您只需要System.Type。在上面的示例中,您实际上有一个类型名称T,因此new T()会更好。请参阅@ Guffa的答案。

答案 1 :(得分:1)

您可以指定泛型类型的条件。如果你指定它必须有一个构造函数,你甚至不需要Activator来调用它:

public static Create<T>() where T : new() {
  return new T();
}

如果你想在构造函数调用中使用参数,你可以使用Activator,但是那个类应该有一个无参数构造函数的条件是没有意义的。