当 lambda 表达式引用实际实例本身时,我如何调整下面的方法来工作?
例如而不是
x => x.Name
表达式是
x => x
所以如果我有一些类“Car”,我可以返回字符串“Car”,而不是只能对其属性进行操作(例如 Car.Colour)
方法:
public static string GetMemberName(Expression expression)
{
if (expression is LambdaExpression)
expression = ((LambdaExpression)expression).Body;
if (expression is MemberExpression)
{
var memberExpression = (MemberExpression)expression;
if (memberExpression.Expression.NodeType ==
ExpressionType.MemberAccess)
{
return GetMemberName(memberExpression.Expression)
+ "."
+ memberExpression.Member.Name;
}
return memberExpression.Member.Name;
}
if (expression is UnaryExpression)
{
var unaryExpression = (UnaryExpression)expression;
if (unaryExpression.NodeType != ExpressionType.Convert)
throw new Exception(string.Format(
"Cannot interpret member from {0}",
expression));
return GetMemberName(unaryExpression.Operand);
}
throw new Exception(string.Format(
"Could not determine member from {0}",
expression));
}
即我想要这样的东西:
if (expression is SomeExpressionThatReturnsAnInstance)
{
return (name of type of instance);
}
最佳答案
我可能误解了,但是直接的 x => x
将是一个 ParameterExpression
。只需在您现有的 is MemberExpression
测试下添加一个额外的测试:
if (expression is MemberExpression)
{
// As-is
}
// New condition
if (expression is ParameterExpression)
{
return expression.Type.Name;
}
使用这段代码:
class Car { public string Color { get; set; }}
Expression<Func<Car, string>> expr1 = x => x.Color;
Expression<Func<Car, Car>> expr2 = x => x;
Console.WriteLine(GetMemberName(expr1));
> Color
Console.WriteLine(GetMemberName(expr2));
> Car
关于c# - 使用 lambda 表达式获取属性或类型名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29788448/