2009-02-25 29 views
1

我該如何編譯下面的代碼?通用委託或通用鑄造問題

Action<MyClass<object, object>> func = x => Console.WriteLine(x.ToString()); 

    public void Apply<T1, T2>(MyClass<T1, T2> target) 
    { 
     func.Invoke(target); 
    } 

我知道它不工作,因爲MyClass的< T1,T2 >心不是一個MyClass的<對象,對象>,但我能做些什麼?

我可以使函數泛型嗎? 或 我可以施放目標嗎?

不管怎麼樣,怎麼樣?

如果有幫助,func中的任何內容都不會執行任何T1或T2特定的操作。我知道這個假設可能會讓它變得脆弱,但單元測試應該能夠解決任何問題。

編輯:我現在避免了這個問題,因爲大量的空接口,我寧願不要這樣做!

感謝

回答

10

那麼,一個選擇是編寫一個通用的方法來返回正確類型的功能:

public void Apply<T1, T2>(MyClass<T1, T2> target) 
{ 
    GetFunc<T1,T2>().Invoke(target); 
} 

private Action<MyClass<T1,T2>> GetFunc() 
{ 
    return x => Console.WriteLine(x.ToString()); 
} 

或者,如果你真的希望能夠申報「我可以工作與任何MyClass「行動,我建議你創建一個非泛型類型MyClass,使MyClass<T1,T2>從中獲得:

public class MyClass 
{ 
    // Put common stuff in here 
} 

public class MyClass<T1, T2> : MyClass 
{ 
    // Put stuff using T1 and T2 here 
} 

ŧ如果您可以使用Action<MyClass>代替。

+0

doh,當然是通用的方法!我討厭深夜編碼!乾杯 – 2009-02-25 23:12:59

0

在您提到的特定情況下,您只需將Action>更改爲Action,因爲您沒有使用任何特定於「MyClass」的方法。

如果你想使用'MyClass'特有的方法,它們不依賴泛型,那麼你應該定義一個包含這些方法的基類,從它派生MyClass,並使用基類型作爲參數類型代表。

如果您希望使用依賴泛型類型的'MyClass'特有的方法,那麼您應該在調用時使用正確的類型創建委託。