使用泛型方法创建接口

时间:2014-04-21 22:43:44

标签: c# generics interface

我正在尝试设计一个接口,以便它具有泛型类型的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方法定义?

2 个答案:

答案 0 :(得分:1)

您可以使用this.GetType()确定继承的类类型,但这不允许您创建通用函数/参数/等。

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

答案 1 :(得分: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 { ... }

这更灵活,但也意味着更少的编译时类型检查。