2015-08-14 81 views
2

假設下面的界面,我使用來定義參數類型和用於存儲過程返回類型...使用通用接口作爲typeparameter爲方法或函數

public interface IStoredProcedure<out TReturn, out TParameter> 
    where TReturn : class 
    where TParameter : class 
{ 
    TReturn ReturnType { get; } 

    TParameter ParameterType { get; } 
} 

...是有可能通過這個界面作爲TypeParameter的一種方法?沿此線的東西(不編譯)

public static void DoAction<TProcedure>(TProcedure procedure1) 
     where TProcedure : IStoredProcedure<TReturnType, TParameterType> 
{ 
     // do some work 
} 

...或沿着這些路線的東西...

public static void DoAction<IStoredProcedure<TReturnType, TParameterType>>(IStoredProcedure procedure1) 
     where TReturnType : class 
     where TParameterType : class 
{ 
     // do some work 
} 

沒有這兩種方法的編譯,我只是不能工作了如何編寫它們以使其編譯。在DoAction()方法中,我需要intergate參數的類型和返回類型。

回答

4

您需要使用類型參數,你指定的接口:

public static void DoAction<TReturnType, TParameterType> 
    (IStoredProcedure<TReturnType, TParameterType> procedure1) 
    where TReturnType : class 
    where TParameterType : class 
{ 
    // do some work 
} 

...否則你指的是一個非通用IStoredProcedure接口。 (不要忘記C#允許類型被泛型所「超載」。)

+1

我不確定這個編譯。它不應該是'DoAction '? –

+1

@Charles:對不起,是的。重點是參數,並沒有發現類型參數問題。固定。 –

+0

是的,現在的作品謝謝你,並回答alsow什麼是我的下一個問題是如何使該方法成爲一個函數返回一個TReturnType的列表,但現在所有的作品現在這樣.. public list 的getAction (IStoredProcedure 程序1) 其中TReturnType:類 其中TParameterType:類 {// 做一些工作 返回新的List (); } – Dib

1
public static void DoAction<TProcedure, TReturnType, TParameterType>(TProcedure procedure1) 
     where TProcedure : IStoredProcedure<TReturnType, TParameterType> 
     where TReturnType : class 
     where TParameterType : class 
     { 
      // do some work 
     } 
+0

這並沒有爲我編譯。 – Dib

+1

編輯完成後立即編譯,但@Jon Skeet首先使用了符合我的需求的編譯解決方案,因此接受了他的答案。抱歉。 – Dib

+1

另外,對於非泛型的東西使用類型參數會造成混淆和不必要。在某些情況下,使用'TProcedure'會很有用(例如,如果您返回了「TProcedure」),但這不是其中之一。 – Luaan