实现接口通用功能

时间:2014-06-14 21:49:02

标签: c# generics

我的服务中有这个函数,它使用泛型类型,所以我不必在这个项目中引用另一个项目。

async Task<string> EagerLoadAllAsync<T>(
   params Expression<Func<T, object>>[] includeProperties) where T : class;

当我在具体课程中实现这个时,我可以这样做(或类似的东西):

async Task<string> EagerLoadAllAsync<Lead>(
   params Expression<Func<Lead, object>>[] includeProperties);

对我来说无关紧要,我只是想知道?

2 个答案:

答案 0 :(得分:4)

不,因为被覆盖的方法无法处理所有可能的T。它只适用于Lead。这会危及类型安全,是不允许的。

答案 1 :(得分:3)

正如我们回答的那样,不,不可能直接回答。

但是,根据您的具体需求,可能会以满足您需求的方式满足您的需求。

现在,您的界面(我猜是一个抽象类,但对于这个答案而言并不重要)被定义为

abstract class C {
  async Task<string> EagerLoadAllAsync<T>(
     params Expression<Func<T, object>>[] includeProperties) where T : class
  { ... }
}

相反,您的界面可能是具有非通用方法的通用类型

abstract class C<T> where T : class {
  async Task<string> EagerLoadAllAsync(
     params Expression<Func<T, object>>[] includeProperties)
  { ... }
}

您的派生类将派生自C<Lead>而不是C

但是,这确实需要修改C的所有用户,以解释它现在是通用类型的事实。