2014-04-21 61 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()来确定继承的类的类型,但不会像您所做的那样创建泛型函数/参数/等。

因此,对于你的答案,不,你不能以任何方式使用该类型(你仍然可以获得类的基类并使用它,但不能将其设置为返回类型/参数类型/等等)。