2012-12-13 121 views
1

我有以下。鑄造通用接口

public interface IMyService<T> 
    where T: BaseModelType 
{ 
    Process(T input); 
}   

public class BaseModelType 
{ 
    ...some property 
} 

public class SomeClass : BaseModelType 
{ 
    ...some properties 
} 

public ServiceImpl : IMyService<SomeClass> 
{ 
    ...the properties 
} 

然後,我有一個統一容器,我註冊了通用接口的所有實現。我希望能夠使用unitycontainer的解析方法來獲取接口,然後對它做一些工作。在當我想用解決方法我在運行時

new UnityContainer.Resolve(myTypeVar) 

我可以以某種方式投類型的時候這是

IMyService<BaseModelType> value = new UnityContainer.Resolve(myTypeVar) //want to cast it here from object. 

,這樣我可以調用過程方法的接口定義。

+0

我想補充這一點,我想用一個控制器動作打造保存所有的步驟建立在MVC的嚮導。該步驟正在使用接口來處理它所需的內容,然後它將返回下一步,具體取決於第一步中輸入的內容。 – Captain0

回答

3

不,因爲IMyService<SomeClass>沒有執行IMyService<BaseModelType>。如果你看看過程方法的實現:

public void Process(SomeClass input){...} 

這顯然假設你給它一個SomeClass。它應該能夠安全地訪問SomeClass的任何成員。但是,如果您以BaseModelType作爲參數調用此方法,那不起作用,對嗎?

假設你在您input的說法將是正確的類型爲給定的通用IMyService<T>接口的運行時間知道,你有兩個選擇:

  1. 通過反射調用泛型方法簽名。有點慢,但有效。
  2. IMyService添加一個非通用父接口,該接口需要BaseModelType。在您的服務實現中,您可以通過將輸入轉換爲該實現的預期類型來實現此方法。這需要更多的代碼。但是,通過使用實現此方法的通用抽象基類,您可以減輕這一點,因此其他實現不必這樣做。

    void Main() 
    { 
        var s = (IMyService)new ServiceImpl(); 
        s.Process(new SomeClass()); 
    } 
    
    public interface IMyService 
    { 
        void Process(BaseModelType input); 
    } 
    
    public interface IMyService<in T> : IMyService 
        where T: BaseModelType 
    { 
        void Process(T input); 
    } 
    
    public class BaseModelType{} 
    
    public class SomeClass : BaseModelType{} 
    
    public abstract class ServiceBase<T> : IMyService<T> 
        where T: BaseModelType 
    { 
        void IMyService.Process(BaseModelType input) 
        { 
         Process((T)input); 
        } 
    
        public abstract void Process(T input); 
    } 
    
    public class ServiceImpl : ServiceBase<SomeClass>{ 
        public override void Process(SomeClass input){} 
    } 
    
+0

感謝百萬,解釋和代碼片段正是我正在尋找的。 – Captain0