2011-04-11 77 views
0

我在努力做到不可能,還是簡單的不必要? GetList中的代碼對於A類的所有特化都是相同的,除了創建專業化的新實例的位之外。沒有默認構造函數,始終是相同的參數列表。這是C#泛型可能的變體嗎?

目前我使用的,而不是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); 

回答

2

您不能在泛型類型上調用參數化構造函數。您的功能<>版本是這裏最好的方法。

0

你不能那樣做。您只能指定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; 
} 
+0

將需要一個Func,因爲我創建了很多實例 – 2011-04-11 15:01:38

+0

你能解釋爲什麼嗎? – 2011-04-11 15:03:17

3

運營商new編爲Activator.CreateInstance

只要寫

Activator.CreateInstance(typeof運算(T),新的對象[] {I})

並不完美,但工作。

+1

不,它不會編譯爲調用Activator.CreateInstance – Dyppl 2011-04-11 14:57:23

+0

:)你是否舒服? – gandjustas 2011-04-11 15:02:03

+0

http://stackoverflow.com/questions/367577/why-does-the-c-compiler-emit-activator-createinstance-when-calling-new-in-with-a – gandjustas 2011-04-11 15:02:30

0

我認爲使用默認構造函數並將我作爲字段移到基類(A)會更好。 但在某些情況下,它可能更適合使用反射