-1

这是不合法的:

public class MyBaseClass
{
  public MyBaseClass() {}
  public MyBaseClass(object arg) {}
}


public void ThisIsANoNo<T>() where T : MyBaseClass
{
  T foo = new T("whoops!");
}

为此,您必须对 T 的类型对象进行一些反思,或者您必须使用 Activator.CreateInstance。两个都很恶心。有没有更好的办法?

4

4 回答 4

2

没有。如果您没有传入参数,那么您可以将类型参数限制为需要无参数构造函数。但是,如果您需要传递参数,那么您就不走运了。

于 2008-09-18T20:28:56.320 回答
1

您不能将 T 限制为具有除空构造函数之外的特定构造函数签名,但您可以将 T 限制为具有具有所需签名的工厂方法:

public abstract class MyBaseClass
{
    protected MyBaseClass() {}
    protected abstract MyBaseClass CreateFromObject(object arg);
}

public void ThisWorksButIsntGreat<T>() where T : MyBaseClass, new()
{
    T foo = new T().CreateFromObject("whoopee!") as T;
}

但是,我建议也许在这种情况下使用不同的创建模式,例如抽象工厂。

于 2008-09-18T20:45:13.130 回答
0
where T : MyBaseClass, new()

仅适用于无参数公共构造函数。除此之外,回到 activator.CreateInstance (这真的不是那么糟糕)。

于 2008-09-18T20:28:55.493 回答
-2

我可以看到这不起作用。

但是是什么阻止你这样做呢?

public void ThisIsANoNo<T>() where T : MyBaseClass
{
  MyBaseClass foo = new MyBaseClass("whoops!");
}

由于所有内容都将从 MyBaseClass 继承,它们都将是 MyBaseClass,对吗?

我试过了,这行得通。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            ThisIsANoNo<MyClass>();
            ThisIsANoNo<MyBaseClass>();
        }

        public class MyBaseClass
        {
            public MyBaseClass() { }
            public MyBaseClass(object arg) { }
        }

        public class MyClass :MyBaseClass
        {
            public MyClass() { }
            public MyClass(object arg, Object arg2) { }
        }

        public static void ThisIsANoNo<T>() where T : MyBaseClass
        {
            MyBaseClass foo = new MyBaseClass("whoops!");
        }
    }
}
于 2008-09-18T20:31:37.407 回答