我是在尝试实现不可能还是仅仅是不必要的?除了用于创建特殊化的新实例的位之外,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);
答案 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)。 但在某些情况下,使用反射可能更合适