使用C#Generics可以改变这种情况吗?

时间:2011-04-11 14:46:44

标签: c# generics

我是在尝试实现不可能还是仅仅是不必要的?除了用于创建特殊化的新实例的位之外,GetList中的代码对于类A的所有特化都是相同的。没有默认构造函数,总是相同的参数列表。

目前我正在使用public static List<A> GetList(int i, Func<A> createMeAnInstance)

哪个感觉不干净。

abstract class A
{
  protected A (int i)
  {

  }

  public static List<T> GetList<T>(int i) where T : A
  {
    var list = new List<T>();
    for(int x = 1; x< 100; x++)
    {
     var o = new T(i);
     list.Add(o);
    }
  }
 }   

 public class B : A
 {
    public B (int i) : base(i) {}
 }

 ...

 var list = A.GetList<B>(1);

5 个答案:

答案 0 :(得分:3)

运营商new编译为呼叫Activator.CreateInstance

只需写下

  

Activator.CreateInstance(typeof(T),new object [] {i})

不完美但有效。

答案 1 :(得分:2)

您不能在泛型类型上调用参数化构造函数。您的 Func&lt;&gt; 版本是最好的方法。

答案 2 :(得分:0)

你做不到。您只能将new()指定为构造函数的类型约束。

为什么不直接在B中使用GetList个实例?

List<B> list = A.GetList(new B(i));

使用此代码:

public static List<T> GetList<T>(T o) where T : A
{
    var list = new List<T>();
    list.Add(o);
    return list;
}

答案 3 :(得分:0)

如果我理解正确的话...... 您可以通过反映它的构造函数或使用Activator来创建T的实例。

答案 4 :(得分:0)

我认为最好使用默认构造函数并将i作为字段移动到基类(A)。 但在某些情况下,使用反射可能更合适