1

私はこれに関する記事を一日中読んでいますが、どれも私が得た状況に十分に一致していないようです. 次のメソッドを持つクラスがあります。

IQueryable<TBusinessContract> Query<TBusinessContract>(
    Expression<Func<TBusinessContract, bool>> condition, params string[] children )
    where TBusinessContract : BusinessContract;

IQueryable<TSubType> Query<TSuperType, TSubType>(
    Expression<Func<TSubType, bool>> condition, params string[] children )
    where TSuperType : BusinessContract
    where TSubType : BusinessContract;

最初のものの MethodInfo を取得したい。さまざまな組み合わせと順列を試してみましたが、null またはあいまいな一致例外が発生します。私は次のものを思いつきましたが、それは機能していますが、少しぎこちなく感じます。

MethodInfo queryMethod = Dal.GetType()
    .GetMethods( BindingFlags.Public | BindingFlags.Instance )
    .Where( mi => mi.Name == "Query" )
    .Where( mi => mi.IsGenericMethod )
    .Where( mi => mi.GetGenericArguments().Length == 1 )
    .SingleOrDefault();

これは私ができる最善のことですか、それとも何か不足していますか? .NET 4.5 を使用しています。

4

1 に答える 1

1

これらの状況に適したリフレクション方法はないようです。あなたのすることはいいと思います。もう少しコンパクトに書かれています:

MethodInfo queryMethod = Dal.GetType().GetMethods()
    .SingleOrDefault(mi => mi.Name == "Query" &&
    mi.GetGenericArguments().Length == 1);

型に という名前の非ジェネリック メソッドが含まれていたとしても、適切に動作し、空の (長さゼロの) 配列を返すQueryように見えます。GetGenericArguments

于 2013-03-28T02:12:46.637 に答える