2013-07-11 119 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

感谢您的回复和备用解决方案。 –