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

1 回答 1

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方法返回dynamicdynamic,问题是你自己的提供者,那会起作用。

但基本上:

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();

应该做的工作。

于 2013-07-11T08:18:57.463 回答