2012-11-06 39 views
10

我有一個使用以下類型的接口工廠類返回一個通用接口

interface IActivity<T> 
{ 
    bool Process(T inputInfo); 
} 

具體類是像如下

class ReportActivityManager :IActivity<DataTable> 
{ 
    public bool Process(DataTable inputInfo) 
    { 
     // Some coding here 
    } 
} 

class AnalyzerActivityManager :IActivity<string[]> 
{ 
    public bool Process(string[] inputInfo) 
    { 
     // Some coding here 
    } 
} 

現在我該怎麼寫這個工廠類retuns一些具體一個像IActivity這樣的通用接口。

class Factory 
{ 
    public IActivity<T> Get(string module) 
    { 
     // ... How can i code here 
    } 
} 

感謝

+0

得到錯誤..錯誤CS0050:可訪問性不一致:返回類型 – Anish

回答

14

您應該創建通用的方法,否則編譯器將不知道返回值的類型T。當你將有T,你將能夠基於類型的T創建活動:

class Factory 
{ 
    public IActivity<T> GetActivity<T>() 
    { 
     Type type = typeof(T); 
     if (type == typeof(DataTable)) 
      return (IActivity<T>)new ReportActivityManager(); 
     // etc 
    } 
} 

用法:

IActivity<DataTable> activity = factory.GetActivity<DataTable>(); 
+0

我得到一個錯誤「錯誤CS0050:可訪問性不一致:返回類型」 – Anish

+0

也越來越無法鍵入「Factory.ReportActivityManager」隱式轉換爲「Factory.IActivity 」。存在明確的轉換(你是否缺少演員?) – Anish

+0

@Anish對不起,只需添加演員。我已經更新了答案。 –

1

通常這被實現爲lazyberezovsky's answer。在C++中,當您嘗試創建工廠無法處理的類型時,可以使用模板特化來獲得編譯器錯誤。

你不能在C#中做到這一點,但你可以關閉。雖然代碼可能看起來有點令人驚訝,反過來可能是一個問題。

public static class Factory { 
    public static IActivity<someType> Get(this someType self){ 
      //stuff specific to someType 
    } 

    public static IActivity<someOtherType> Get(someOtherType self){ 
      //stuff specific to someOtherType 
    } 

    public static T Creator<T>(){ 
     return null; 
    } 

} 

的使用將被

IActivity<someType> act = Factory.Creator<someType>().Get(); 
當然這只是作品的

如果你能通過具體類型。如果你需要傳遞一個類型參數,事情會變得更加複雜。

+0

我對C#不是很好,但是它僅僅是一個疏忽,第二個不是擴展方法? –

+0

此外,關於「您可以使用模板特化來獲得編譯器錯誤,當您嘗試創建一個工廠不處理的類型」時,您是否可以使用類型約束來獲取編譯器錯誤,當工廠交給一個類型時它不會想要處理? –