这是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);
操作符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;
}