这是c#泛型的一个变体

本文关键字:一个 泛型 这是 | 更新日期: 2023-09-27 17:49:48

我是在努力实现不可能的目标还是根本没有必要?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);

这是c#泛型的一个变体

操作符new编译为调用Activator.CreateInstance

直接写

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

不能在泛型类型上调用参数化构造函数。您的Func<>版本是这里最好的方法。

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

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

可能更合适

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

为什么不直接在GetList中取B实例呢?

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;
}