2015-10-12 43 views
1

如何爲自定義對象創建存儲庫對象? 當我創建回購對象時,我不知道CustomEntity類型。用反射創建通用存儲庫<T>

我想下面的東西。

var _unitofWork = new UnitOfWork(); 
var objRepository = new Repository<Type.GetType("EntityName")>(_unitofWork); 

任何人都可以幫忙嗎?

+0

你不能編寫var objRepository = new Repository (_unitofWork);''除非在編譯時知道類型'X'。 – Enigmativity

回答

2

您無法爲任何任意類型合理地創建存儲庫。

如果對象需要沒有共同之處,那麼存儲庫代碼將不知道如何處理它們。你將如何編寫代碼來處理Customer,ComplexNumber和System.Object?

如果您所關注的對象具有足夠的共同特性以便能夠以通用方式處理它們,請使用通用基類或它們都實現的接口來表示該通用性。然後,你可以做

var rep = new Repository<IMyCommonalities>(_unitOfWork); 
1

您可以通過使用MakeGenericTypeActivator

var _unitofWork = new UnitOfWork(); 
var objRepository = Activator.CreateInstance(typeof(Repository<>).MakeGenericObject(Type.GetType("EntityName")), _unitofWork); 

唯一的問題是,Activator.CreateInstance返回一個對象在運行時創建的通用對象。沒有所有通用類型的通用接口,沒有簡單的方法來訪問任何成員。也許你有一個像IRepository這樣的界面,不需要你可以使用的通用界面。在這種情況下,將返回值CreateInstance投射到它。如果你沒有這樣的接口,你必須使用反射或dynamic如果你調用一個無效的成員會導致運行時錯誤。