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

时间:2009-03-30 19:59:05

标签: 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");
    }   
}

如何实现Util.Print方法以将此输出发送到控制台:

Begin
Id
Server
Ping
End

3 个答案:

答案 0 :(得分: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");

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

 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();
        }
    }
}

答案 1 :(得分:4)

除了Marc的回答:here is an article,它解释了几种做你想做的事情的方法(一种这样的方法使用表达式)。

答案 2 :(得分:-1)

public string Id {
    get {
      return "Id;"
    }
}

嘿嘿呃,虽然我认为这不是你的意思:-(答案可能与反思有关。

查看http://msdn.microsoft.com/en-us/library/ms173183(VS.80).aspx