2014-04-21 157 views
3

我正在嘗試設計一個接口,以便它具有泛型類型的id和一個返回實現此接口的類的類型的泛型方法。例如:使用通用方法創建接口

public interface IEntity <IDType, MethodReturnType> 
{ 
    IDType ID {get; set;} 
    MethodReturnType Get(); 
} 

public class Model : IEntity<int, Model> 
{ 
    int ID {get; set; } 
    Model Get() { // do something } 
} 

我的問題是,它似乎傻擺在型號爲IEntity的第二個類型參數,因爲我在模型的類是已經,應該是某種智能的方式來找出鍵入是(儘管使用泛型類型需要在編譯之前確定它)。

是否有任何其他解決方案可以幫助我擺脫模型類型,同時在接口中保留Get方法定義?

+0

ID是否允許您擺脫「int」?它不允許我用fw 4.0在vs 2010中編譯它... – Gusman

+0

不,沒有辦法。如果這是可能的,但..我設計的很多API都會更清晰! –

+0

只有其他選項是將'MethodReturnType'替換爲'Object'。 – Dialecticus

回答

1

在這種情況下,有兩種典型的方法來設計你的類和接口。我會從你確切的例子中略微偏離,試圖讓答案更一般。

選擇哪個選項取決於您希望如何使用類和接口。

選項1

製作接口通用,所以該接口成員的確切類型的知識。

public interface IEntity<TDescription> 
{ 
    TDescription Get(); 
} 

public class MyModel : IEntity<MyDescription> 
{ 
    MyDescription Get() { ... } 
} 

public class MyDescription { ... } 

這意味着,當您使用界面IEntity<TDescription>你需要知道TDescription在使用時間。好處是您可以獲得更多的編譯時類型檢查。

選項2

不要讓你的界面通用的,而是有你的接口成員使用接口以及。

public interface IEntity 
{ 
    IDescription Get(); 
} 

public interface IDescription { ... } 

public class MyModel : IEntity 
{ 
    MyDescription Get() { ... } 
    IDescription IEntity.Get() { return this.Get(); } 
} 

public class MyDescription : IDescription { ... } 

這更靈活,但它也意味着更少的編譯時類型檢查。

+0

當我有Get()方法時,它用於從數據庫中檢索對象,所以它應該返回類(Model)的類型。我想知道這個MyDescription \ IDescription的上下文是什麼? – jamesdeath123

+0

@jamesdeath「我會從你的確切例子中略微偏離,試圖讓答案更一般。」沒有任何關於您具體的情況改變了必須做出的一般問題和設計決定:是否在界面中使用泛型或輔助界面。 –

1

您可以使用this.GetType()來確定繼承的類的類型,但不會像您所做的那樣創建泛型函數/參數/等。

因此,對於你的答案,不,你不能以任何方式使用該類型(你仍然可以獲得類的基類並使用它,但不能將其設置爲返回類型/參數類型/等等)。