打印属性名称(不是您想的)

Ras*_*mus 5 c#

这是一个我无法回答的粗略问题.

主程序

class Program{
    static void Main(string[] args){
        Console.WriteLine("Begin");
        var myClass = new MyClass();
        Util.Print(myClass.Id);
        Util.Print(myClass.Server);
        Util.Print(myClass.Ping);
        Console.WriteLine("End");
    }   
}
Run Code Online (Sandbox Code Playgroud)

如何实现Util.Print方法以将此输出提供给控制台:

Begin
Id
Server
Ping
End
Run Code Online (Sandbox Code Playgroud)

Mar*_*ell 14

假设您不想使用字符串,最常见的答案是通过Expression- 基本上模拟缺失infoof; 你必须使用类似的东西:

    Console.WriteLine("Begin");
    var myClass = new MyClass();
    Util.Print(() => myClass.Id);
    Util.Print(() => myClass.Server);
    Util.Print(() => myClass.Ping);
    Console.WriteLine("End");
Run Code Online (Sandbox Code Playgroud)

假设它们都是属性/字段(编辑添加的方法调用支持):

 public static class Util
{
    public static void Print<T>(Expression<Func<T>> expr)
    {
        WriteExpression(expr);
    }
    public static void Print(Expression<Action> expr) // for "void" methods
    {
        WriteExpression(expr);
    }
    private static void WriteExpression(Expression expr)
    {
        LambdaExpression lambda = (LambdaExpression)expr;
        switch (lambda.Body.NodeType)
        {
            case ExpressionType.MemberAccess:
                Console.WriteLine(((MemberExpression)lambda.Body)
                    .Member.Name);
                break;
            case ExpressionType.Call:
                Console.WriteLine(((MethodCallExpression)lambda.Body)
                    .Method.Name);
                break;
            default:
                throw new NotSupportedException();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)