返回委托的Lambda表达式

Mer*_*sur 6 .net c# lambda delegates expression

嗨,我想尝试这样的事情;

Method<TObjectType>(m=>m.GetData); //m is the instance of TObjectType
Run Code Online (Sandbox Code Playgroud)

如果我可以成功,那么我可以访问此表达式并获取GetData方法并使用它来创建动态SQL查询.我可以通过将方法名称作为字符串来完成此操作但是我不想打破我的开发人员朋友的强类型世界.

我知道我必须给出代表的确切定义,但这对我没有帮助;

void Method<TObjectType>(Expression<Func<TObjectType, Delegate>> ex){/**/}
Run Code Online (Sandbox Code Playgroud)

你有好主意吗?

Mar*_*ell 6

不幸的是,几乎没有"代表"这样的事情.对于大多数目的(尤其是:用于解析a MethodInfo),它必须是强类型的委托.这是因为GetData不是方法,它是方法组.您确实需要精确指定方法,或者具有已知的委托类型(最终会执行相同的操作).

你有两个实用的选择; 工作object,或添加通用.例如:

void Method<TObjectType>(Expression<Func<TObjectType,object>> ex) {...}
Run Code Online (Sandbox Code Playgroud)

会工作,因为:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,TValue>> ex) {...}
Run Code Online (Sandbox Code Playgroud)

来电者会使用:

Method<Foo>(x => x.GetData());
Run Code Online (Sandbox Code Playgroud)

如果您确实想使用委托,则类型必须是可预测的,例如:

void Method<TObjectType>(Expression<Func<TObjectType,Func<int>>> ex)
Run Code Online (Sandbox Code Playgroud)

允许:

Method<Foo>(x => x.GetData);
Run Code Online (Sandbox Code Playgroud)

或者,如果您知道(例如)该方法始终是无参数的,但您不知道返回类型; 也许是这样的:

void Method<TObjectType, TValue>(Expression<Func<TObjectType,Func<TValue>>> ex)
Run Code Online (Sandbox Code Playgroud)

这使得:

Method<Foo, int>(x => x.GetData);
Run Code Online (Sandbox Code Playgroud)