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メソッドが を返した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();

仕事をするべきです。

于 2013-07-11T08:18:57.463 に答える