是否可以在泛型类型上定义扩展方法并返回另一个泛型类型,而无需在<>中定义两个泛型类型

时间:2013-07-11 08:11:35

标签: c# .net generics extension-methods

是否可以做这样的事情:

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

并使用:

item.ConvertType<NewObject>()

或者我必须这样做:

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

并使用:

item.ConvertType<OriginalObject, NewObject>()

必须指定调用扩展方法的类型似乎是多余的,我错过了什么?

1 个答案:

答案 0 :(得分: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();

应该做的。