Func <DomainObject,object>如何将对象名返回为字符串

R R*_*R R 6 c# delegates func

我有这样的静态方法:

    public static string MyMethod(Func<Student, object> func)
    {            
        return ??? ;
    }
Run Code Online (Sandbox Code Playgroud)

我用它如下:

    var s1 = MyMethod(student => student.ID); // Return "ID" ???
    var s2 = MyMethod(student => student.Age); // Return "Age" ???
    var s3 = MyMethod(student => student.Name); // Return "Name" ???
Run Code Online (Sandbox Code Playgroud)

怎么写方法返回以下结果?

  • s1:"ID"
  • s2:"年龄"
  • s3:"名字"

*在=>之后返回每个属性的名称作为字符串

vit*_*ore 1

您可以更改方法的签名

  public static string MyMethod(Func<Student, object> func)
Run Code Online (Sandbox Code Playgroud)

将其更改为

  public static string MyMethod(Expression<Func<Student, object>> func) {
     return GetMemeberName(func)
  } 

  public static string GetMemberName(Expression expression)
    {            
        if (expression is LambdaExpression)
        {
            var lambdaExpression = (LambdaExpression)expression;
            return GetMemberName(lambdaExpression.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));
    }  
Run Code Online (Sandbox Code Playgroud)

  • 基本上,这是一堆代码,虽然有用,但离回答所述问题还差得很远。如果它成为真正的答案,我会投票。 (4认同)
  • 这很好,但你必须告诉他如何让它发挥作用。OP 有 `Func&lt;&gt;`,而不是 `Expression`。 (2认同)