创建具有通用方法的接口

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 }
}

我的问题是,将Model作为IEntity的第二个类型参数似乎有些愚蠢,因为我已经在Model的类中了,应该有一种智能的方法来确定它是什么类型(尽管使用泛型类型需要在编译时确定)。

是否有其他解决方案可以让我摆脱Model类型,同时保留接口中的Get方法定义?


ID是否允许您消除“int”?使用fw 4.0在vs 2010中编译时,它不允许我这样做... - Gusman
唯一的其他选择是将 MethodReturnType 替换为 Object - Dialecticus
@Gusman 不好意思,模型中的ID应该是int类型的。 - jamesdeath123
@Dialecticus 看起来会进行过多的上转换并在使用 Get() 时创建额外的工作。 - jamesdeath123
如果将接口重新定义为 IEntity<IDType>,并将方法重新定义为 IEntity Get();,那么在其他地方的损失有多严重? - ClickRick
显示剩余2条评论
2个回答

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 { ... }

这种方法更加灵活,但也意味着编译时类型检查较少。


当我有Get()方法时,它用于从数据库检索对象,因此应返回类(Model)的类型。我想知道这个MyDescription\IDescription的上下文是什么? - jamesdeath123
@jamesdeath:“我会稍微偏离你的具体示例,以尝试使答案更加通用。”与您拥有的特定情况无关,这不会改变必须做出的一般问题和设计决策:是在接口中使用泛型还是次要接口。 - Timothy Shields

1
你可以使用this.GetType()确定继承类的类型,但这不允许你创建通用函数/参数等。
所以回答你的问题,不,除非你不以任何方式使用该类型(你仍然可以获取类的基本类型并使用它,但不能将其设置为返回类型/参数类型等)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接