2010-08-04 76 views
10

我有一個對象集合,我將其作爲參數傳遞以創建另一種類型的對象(一對一)。我在很多地方都這樣做(基本上是從數據對象轉換爲業務對象)。我想寫一個通用的擴展方法來完成這個。但是我被卡住了,因爲我不知道如何指定約束條件,即業務對象具有以數據對象爲參數的構造函數。以下是我的功能代碼:爲通用參數指定構造函數約束

public static IList<T> ConvertTo<A,T>(this IEnumerable<A> list) 
        where T : new(A)/*THIS IS PROBLEM PART*/ 
{ 
    var ret = new List<T>(); 

    foreach (var item in list) 
    { 
     ret.Add(new T(item)); 
    } 
    return ret; 
} 

回答

13

不幸的是,這在C#中是不允許的。您可以有一個new()約束,強制類型具有默認構造函數,但這是.NET支持的唯一與構造函數相關的約束。

你最好的選擇可能是定義一個你可以使用的接口,並限制接口。您可以使用「初始化」樣式方法來取得「A」對象,並調用該方法,而不是嘗試在構造中設置對象。

+0

是的界面方式很好,我可以使用它,因爲我使用T4模板來生成BO,所以不會太多的工作。 – TheVillageIdiot 2010-08-04 18:16:09

3

你不能用這種方式約束通用類型構造(只需要一個參數的構造函數),但你可以採取委託做建築:

public static IList<T> ConvertTo<A, T>(this IEnumerable<A> list, Func<A, T> constructionFunc) 
{ 
    return list.Select(constructionFunc).ToList(); 
} 

而且使用這樣的:

var IList<T> converted = someSequence.ConvertTo(a => new T(a)); 
+0

函數參數的任何例子?我應該在T類中定義它? – TheVillageIdiot 2010-08-04 18:14:28