2

次のような一般的なリポジトリメソッド呼び出しがあります

var result = Repository<MyDbClass>.Get(x => x.MyProperty1 == "Something"
&& (!x.MyProperty2.HasValue || x.MyProperty2 == "SomethingElse"));

リフレクションを使用してこのメ​​ソッドを呼び出したいと考えています。私は主に、リフレクションを使用してラムダ式をパラメーターとして渡す方法を探しています。

編集

実際、リポジトリのタイプは実行時にのみ認識されます。これらすべてのリポジトリの下にあるテーブルは類似しており、いくつかの列が共通しています。これらの列にフィルターが適用されます。そのため、式をそのまま渡すことはできません。

public void SomeMethod<T, TR>(T repository, TR dataObject)
{
    var type = repository.GetType();
    var dataType = dataObject.GetType();
    var getMethod = type.GetMethod("Get");
    //How to invoke the method by passing the lambda as parameter(??)

}
4

1 に答える 1

1

合格してみてくださいFunc<TR, bool>

var method = typeof(TR).GetMethod("Get");

if (method != null)
{
    method.Invoke(new Func<TR, bool>(
        (x) => x.MyProperty1 == "Something" /* etc... */));
}

メソッドでLINQメソッドを使用すると仮定するとGet、次のように関数を入力できます。

public IEnumerable<TR> Get<TR>(Func<TR, bool> func)
{
    return
        db.MyDbClassEntities.Where(func);
}
于 2013-01-24T12:45:57.443 に答える