2013-07-11 160 views
1

是否有可能做這樣的事情:是否有可能沒有定義兩個泛型類型的泛型類型定義的擴展方法,並返回另一個泛型類型<>

public static T ConvertTo<T>(this TInput input) { 

及用途:

item.ConvertType<NewObject>() 

還是我必須這樣做:

public static TResult ConvertType<TInput, TResult>(this TInput input) { 

及用途:

item.ConvertType<OriginalObject, NewObject>() 

要指定擴展方法被調用的類型似乎是多餘的,我錯過了什麼嗎?

+4

您必須在方法簽名中指定它們,但在方法調用時,編譯器*可能能夠從所提供的參數和您試圖將其返回的類型推斷出它們。 –

+0

如果你做'NewObject ob = item.ConvertType()'編譯器現在將它轉換爲'OriginalObject'和'NewObject' – wudzik

回答

2

不,基本上。有幾個技巧你可以做,但只有它足夠重要。

你可以這樣做:通過像

var dest = item.Convert().To<Something>(); 

static ConversionStub<TInput> Convert<TInput>(this TInput input) { 
    return new ConversionStub<TInput>(input); } 

其中:

struct ConversionStub<T> { 
    private readonly T input; 
    public ConversionStub(T input) { this.input = input; } 
    public TResult To<TResult>() { 
     /* your code here */ 
    } 
} 

您也可以通過掛鉤操作路徑做一些事情dynamic ,但這會導致價值類型的拳擊;但如果您的Convert方法返回dynamic,其中dynamic有問題是您自己的提供者,那就可以。

但基本上:

class ConversionStub<T> : DynamicObject 
{ 
    private readonly T input; 
    public ConversionStub(T input){ 
     this.input = input; 
    } 
    public override bool TryConvert(ConvertBinder binder, out object result) 
    { 
     if(/* you can do it*/) 
     { 
      result = // your code here 
      return true; 
     } 
     result = null; 
     return false; 
    } 
} 

有:

static dynamic Convert<TInput>(this TInput input) { 
    return new ConversionStub<TInput>(input); } 

然後:

SomeType dest = item.Convert(); 

應該做的工作。

+0

感謝您的回覆和備用解決方案。 –