2014-06-14 76 views
2

我在我的服務中使用了一個泛型類型的函數,所以我不必在這個項目中引用另一個項目。實現接口通用函數

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); 

不要緊,對我來說太多了,我只是想知道嗎?

回答

4

不,因爲您的重寫方法將無法處理所有可能的T。它只能在Lead上運行。這危及類型安全並且不被允許。

+0

好吧,歡呼聲,我只想知道。 :) –

3

正如usr回答,不,它不可能直接。

但是,根據您的具體需求,它可能會滿足您的需求。

現在,你的界面(我猜是一個抽象類,但這並不重要,對於這個答案的目的)被定義爲

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>而不是派生3210。

但是,這確實需要修改所有用戶C來說明它現在是一種通用類型。

+0

實際上,看了你的答案,我確實可以這樣做,目前我有一個通用的存儲庫,我在不同的服務中使用,所以我可以爲我的所有服務實現一個通用的服務接口。這將節省大量的寫作。謝謝 :) –