1
 //In a Static class ,extension implementation
 public static IQueryable<T2> ToDTO<T, T2>(this IQueryable<T> source)
    {
        return source.To<T2>();
    }

//Usage
var result = personType1Queryable.ToDTO< personType1, personType2>();

上記のコードでは、拡張機能が表示されています。あるタイプを別のタイプに変換します。したがって、最初にこの参照オブジェクトはpersonType1Queryable型のIQueryable<personType1>です。この関数を次のように呼び出したいだけです。

personType1Queryable.ToDTO<personType2>();

宛先タイプだけを渡したいだけです。この参照オブジェクトはすでに渡されているためです。しかし、コンパイラはこれを受け入れないのはなぜですか?LinqのWhere<T>拡張機能の場合は機能します。私にとってはどうですか?

編集:私はエレンの答えを適用しました。しかし、それでも何かが欠けているようです。

  //works
    public static IQueryable<T2> ToDTO<T,T2>(this IQueryable<T> source)
    {
        return source.Project().To<T2>();
    }

  //gives object reference error. Shown below!
    public static IQueryable<T> ToDTO<T>(this IQueryable<object> source)
    {
        return source.Project().To<T>();
    }

ここに画像の説明を入力してください

http://i.stack.imgur.com/9Yh6H.png

4

2 に答える 2

1

IQueryable<T>はで共変であるため、拡張機能でT必要なものに応じて、これでうまくいく可能性があります。To<T>

public static IQueryable<T> ToDTO<T>(this IQueryable<object> source)
{
    return source.To<T>();
}

IQueryable<T>これは、元の型パラメーター(例personType1)が参照型である場合にのみ機能することに注意してください。そうしないと、コンパイラエラーが発生します。

于 2013-02-08T14:45:46.913 に答える
0

Whereと定義されている

public static IEnumerable<TSource> Where<TSource>( this IEnumerable<TSource> source, Func<TSource, bool> predicate )

ご覧のとおり、ジェネリックパラメーターは1つしか使用されていないため、1つ指定すると「機能」します。メソッドは2つのパラメーターで定義されます。

于 2013-02-08T14:36:06.077 に答える