如何将 lambda 表达式传递给需要 lambda 表达式的方法?
How to pass a lambda expression to a method expecting lambda expression?
我有一个扩展方法来获取 属性 名称作为字符串:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
return ((MemberExpression)propertyId.Body).Member.Name;
}
现在我有另一种方法,希望传入这种属性 lamba表达式的list(param)。
我希望这个新方法重用第一种方法,但不知道如何传递它
public string Test<T>(params Expression<Func<T, object>>[] ps)
{
foreach (var p in ps)
{
var howToCodeThis = p.GetPropertyName(dummy => dummy);
预期用途:
var result = Test<Something>(request.Sorting
, x => x.prop1
, x => x.prop2
, x => x.prop3
);
更新:
一旦我更改我的 GetPropertyName 以迎合 UnaryExpression:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
if (propertyId.Body is MemberExpression)
return ((MemberExpression)propertyId.Body).Member.Name;
if (propertyId.Body is UnaryExpression)
{
var op = ((UnaryExpression)propertyId.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
throw new NotImplementedException(string.Format("GetPropertyName - {0}", propertyId.Body.GetType().FullName));
}
var howToCodeThis = GetPropertyName(default(T), p);
或
var howToCodeThis = default(T).GetPropertyName(p);
但我注意到,您没有在 GetPropertyName 方法中使用 obj
。
我有一个扩展方法来获取 属性 名称作为字符串:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
return ((MemberExpression)propertyId.Body).Member.Name;
}
现在我有另一种方法,希望传入这种属性 lamba表达式的list(param)。 我希望这个新方法重用第一种方法,但不知道如何传递它
public string Test<T>(params Expression<Func<T, object>>[] ps)
{
foreach (var p in ps)
{
var howToCodeThis = p.GetPropertyName(dummy => dummy);
预期用途:
var result = Test<Something>(request.Sorting
, x => x.prop1
, x => x.prop2
, x => x.prop3
);
更新: 一旦我更改我的 GetPropertyName 以迎合 UnaryExpression:
public static string GetPropertyName<T, TResult>(this T obj, Expression<Func<T, TResult>> propertyId)
{
if (propertyId.Body is MemberExpression)
return ((MemberExpression)propertyId.Body).Member.Name;
if (propertyId.Body is UnaryExpression)
{
var op = ((UnaryExpression)propertyId.Body).Operand;
return ((MemberExpression)op).Member.Name;
}
throw new NotImplementedException(string.Format("GetPropertyName - {0}", propertyId.Body.GetType().FullName));
}
var howToCodeThis = GetPropertyName(default(T), p);
或
var howToCodeThis = default(T).GetPropertyName(p);
但我注意到,您没有在 GetPropertyName 方法中使用 obj
。