2012-07-18 70 views
2

比方說,我有一個工廠ressembling這樣的:工廠,建設者和泛型在C#

public static class BusinessObjectFactory 
{ 
    public static T Create<T>(int objectId) where T : BusinessObject, new() 
    { 
     var dataSource = DataLayer.DataSources.Repository.Get<T>(); 
     var serializer = DataLayer.Serializers.Repository.Get<T>(); 

     var businessObject = new T {ObjectId = objectId, DataSource = dataSource, Serializer = serializer}; 

     return businessObject; 
    } 
} 

這個工程提供我對的ObjectId,DataSource和串行公衆存取。

我寧願在我的T型構造函數中指定這些參數,知道 T被約束爲一個BusinessObject,而一個BusinessObject具有這種類型的 構造函數。

我知道我可以像這樣的東西取代我的呼叫轉接至新T:

var businessObject = (T) Activator.CreateInstance(typeof (T), objectId, dataSource, serializer); 

但是,什麼是技術的原因,我的T構造函數必須是無參數的?我覺得有些東西我不懂泛型。我看到了幾個與這個話題相關的問題,但沒有真正啓發我的答案。

+0

編譯器無法驗證(或強制)沒有人編寫派生自「BusinessObject」的類,但沒有一個構造函數接受三個參數「ObjectId,DataSource,Serializer」。那麼這個類可以用作上面的'T'。沒有通用約束的語法來約束具有正確的三參數構造函數的類型。 – 2012-07-18 08:36:30

回答

2

仿製藥是編譯時文物。這意味着在編譯時間會有新生成的合適類。

編譯時間 ctor的參數,還不能確定(如果它不是一個常數)。

這就是爲什麼你必須有一個「空」的ctor,CLR能夠構建你的類型的對象。

+0

謝謝。這是我正在尋找的解釋。 – 2012-07-18 07:19:46

0

只有一個new()約束,指定有一個無參數的構造函數。沒有辦法指定該類型需要構造函數T(ObjectId, DataSource, Serializer)。不在泛型約束中,而不在接口或基類中。