2013-03-26 85 views
0

我正在使用ADO.NET EFRepository pattern。我想分離一些我的實體常見的邏輯,並且我決定最好的方法是使用泛型方法。這是我的方法的聲明:C# - 向通用類型的通用方法的向上轉換

internal static void ChangeCode<T>(IService<T> service, Entity entity, MaskedTextBox txtBox, string newCode, long? entityId) 
      where T : Common.DbContextEntities.Entity 

IService<T>是基類,所有服務中獲得和Entity是基類形式的所有實體派生。但是在運行時,我會通過更具體的服務和實體,如SoleServiceSole。我想完成的是以某種方式聲明一個serviceentity到運行時類型和那些屬性在整個方法中可見。爲了在這裏清楚是什麼,我現在要做的:

if (entity.GetType() == typeof(Sole)) 
      { 
       Sole tempEntity = new Sole(); 
       ISoleService tempService = UnityDependencyResolver.Instance.GetService<ISoleService>(); 

的問題是我只能在if (entity.GetType() == typeof(Sole))範圍內使用tempEntitytempService,如果我必須覈查幾種類型的(這實際上是案件)我必須重複每種不同類型的所有業務邏輯。我正在尋找一種在運行時設置tempEntitytempService的方法,具體方式是可以在方法中隨處使用它們。

回答

1
Sole tempEntity = new Sole(); 
ISoleService tempService = UnityDependencyResolver.Instance.GetService<ISoleService>(); 

可以與

BaseService tempEnitity = (BaseService)Activator.CreateInstance(entity.GetType()); 
IBaseService tempService = tempEnitity.GetServiceInterface(); 

其中BaseService對於所有服務是父(SoleService等)被rewriten,containig虛擬方法返回IBaseService,所有服務的接口的父(ISoleService等)。

因此,您的所有邏輯都可以使用BaseService和IBaseService的方法。

+0

嗯,'IService '是你寫的這個父母。但我認爲爲我想要在我的方法中調用的服務創建另一個接口實際上是非常好的主意。謝謝。現在就試試吧! – Leron 2013-03-26 09:51:09