我正在尝试设计一个接口,以便它具有泛型类型的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 :(得分:1)
您可以使用this.GetType()确定继承的类类型,但这不允许您创建通用函数/参数/等。
所以对你的答案,不,你不能,除非你不会以任何方式使用该类型(你仍然可以获得类的基类型并使用它但不能将其设置为返回类型/参数类型/等)。
答案 1 :(得分:1)
在这种情况下,有两种典型的方法来设计类和接口。我会稍微偏离你的确切例子,试图让答案更加通用。
选择哪个选项实际上取决于您希望如何使用类和接口。
使您的界面具有通用性,以便界面成员了解确切的类型。
public interface IEntity<TDescription>
{
TDescription Get();
}
public class MyModel : IEntity<MyDescription>
{
MyDescription Get() { ... }
}
public class MyDescription { ... }
这意味着当您使用界面IEntity<TDescription>
时,您需要在使用时了解TDescription
。好处是你可以获得更多的编译时类型检查。
不要让你的界面通用,而是让你的界面成员也使用界面。
public interface IEntity
{
IDescription Get();
}
public interface IDescription { ... }
public class MyModel : IEntity
{
MyDescription Get() { ... }
IDescription IEntity.Get() { return this.Get(); }
}
public class MyDescription : IDescription { ... }
这更灵活,但也意味着更少的编译时类型检查。