2012-09-24 84 views
3

我知道我可以調用一個通用的擴展方法C#函數調用

public static object Convert<U>(this U value) 

像這樣(沒有<Class1>要求):

Class1Instance.Convert() 

但是,有沒有辦法撥打:

public static T Convert<U, T>(this U value) 
    where T : Class1, Interface1, new() 
    where U : Class1, Interface2, new() 
{ 
    /******/ 
} 

隨着Class1Instance.Convert<Class2>() 「唯一」,而不是Class1Instance.Convert<Class1, Class2>()

感謝,

編輯:

改定/簡化: 有沒有辦法有:當我們知道類型輸入的輸入

Result result = Convert<Result>(input); 

,而不必說

Result result = Convert<Input, Result>(input) 

隨着一個分機ension方法,它看起來是這樣的:

static TResult Convert<TResult, TInput>(this TInput Input) 
+2

您的意思是 其中T:Class1,IClass1,new() 其中U:Class2,IClass2,new() ? – gabba

+1

我相信他所要求的是一種調用Convert的方法,只需要指定「result」類型參數並讓編譯器推斷「input」類型參數,即「Result result = Convert (input);'我們在哪裏知道Input類型的輸入,而不必說'Result result = Convert (input)'。 –

+1

如果我的推論是正確的,檢查這個問題的答案:http://stackoverflow.com/questions/9354288/c-why-doesnt-generic-type-in​​ference-work-when-there-are-multiple-type- argumen –

回答

0

根據this post,泛型參數推斷僅適用於輸入參數。在我的情況下,其中一個泛型參數是返回類型。

由於需要泛型類型推斷提供所有這些,所以我必須明確指定每個參數。

2

有沒有辦法通過調用代碼指定Convert<Class2>調用Convert<U, T>。但是,如果您確實希望調用代碼看起來像這樣,那麼就有可能。

public static T Convert<T>(this Class1 value) 
    where T : Class1, IClass1, new() 
{ ... } 

而不是輸入類型的泛型,只需指定輸入類型的父類。這會給你你想要的調用代碼,但它會使方法更復雜。例如,如果轉換過程涉及創建新的U對象(在舊方法定義中使用new()通用約束),那麼您必須在新方法中使用反射來完成此操作。

+0

我明白你的意思,但在我的具體情況下是不可能的。無論如何感謝我確認這是不可能實現的。 –