3

アプリケーションで.NETマッピングライブラリAutoMapperを使用しており、次のような一般的な拡張メソッドがあります。

public static T2 Map<T1, T2>(this T1 o)
{
    return Mapper.Map<T1, T2>(o);
}

...

var nc = new NonCustomer();
Customer c = nc.Map<NonCustomer, Customer>();

T1拡張メソッドからジェネリックパラメーターを削除して推測されるようにする方法はありますか?次のような呼び出しが発生します。

var nc = new NonCustomer();
Customer c = nc.Map<Customer>();
4

5 に答える 5

3

いいえ、方法はありません。ジェネリック型推論は、戻り型では機能しません。この種の拡張メソッドの有用性には疑問があります。.Map<TSource, TDest>メソッドを直接操作してみませんか?

于 2012-08-03T09:49:38.687 に答える
3

T1パラメータに汎用バージョンを使用する必要はありません。

オブジェクトに変更する必要があります。

public static TDest Map<TDest>(this object o)
{
    // todo check o is not null
    return (TDest) Mapper.Map(o, o.GetType(), typeof (TDest));
}

AutoMapper v2以降を使用している場合は、次のように記述できます。

public static TDest Map<TDest>(this object o)
{
    return Mapper.Map<TDest>(o);
}
于 2012-08-03T09:53:50.523 に答える
1

素晴らしい質問です。私はいつも怠惰すぎて自分で答えることができませんでしたが、靴屋の子供たちはいつも最後に拡張メソッドを取得します...

問題を回避し、一度に1つの推論を行うことで、少し乾燥させ、間違いなく少しきれいにすることができます。

public static MapperSource<T> Mapper(this T that)
{
    return new MapperSource<T>( that);
}

public class MapperSource<T>
{
    public T2 To<T2>
    {
        return Mapper.Map<T,T2>();
    }
}

これにより、次のことが可能になります。

var nc = new NonCustomer();
Customer c = nc.Mapper().To<Customer>();

Mapper.CreateMapそれらを消費するためのより一般的な方法(とにかく私にとって)は、次のように各ルートにヘルパーを設定することです。

public static Customer ToResult(this NonCustomer that)
{
    return that.Mapper().To<Customer>();
}

(残念ながら、拡張機能のプロパティがないため、これよりもきれいにすることはできません。繰り返しになりますが、F#を使用している場合は、すべて意味がありません)

于 2012-08-03T10:49:47.133 に答える
0

いいえ、できません。c#には部分的な型推論などがないためです。

于 2012-08-03T09:51:35.900 に答える
0

T1ジェネリック型を完全に削除し、次の特定のメソッドを記述した場合のみNonCustomer

public static T2 Map<T2>(this NonCustomer o)
{
    return Mapper.Map<NonCustomer, T2>(o);
}
于 2012-08-03T10:00:08.423 に答える