反思:获取静态属性名称

时间:2014-02-06 17:13:06

标签: c# portable-class-library

我需要获取动态调用为参数的静态属性的属性名称。 这是我的可移植类库代码:

public partial class Test
    {
        public Test()
        {
            string staticPropName = Test.GetPropName(Test.Row); // result must be "Row" without additional string
            System.Diagnostics.Debug.WriteLine("propName=" + staticPropName);
        }

        public static int Row { get; set; }

        public static string GetPropName(object Property)
        {
            return "Row"; // using reflection
        }
    }

我不知道属性的名称,我不想用额外的字符串来定义它。

1 个答案:

答案 0 :(得分:6)

你不能这样做 - 当调用函数时,它获取属性的值,并且不知道这个值来自何处。您的样本等同于

     string staticPropName = Test.GetPropName(42); 

没人会指望返回名字。

您可以尝试将Expression作为参数,这样您就可以实际检查调用哪个方法,如下面的注视点(https://stackoverflow.com/questions/1011109/how-do-you-get-the-name-of-the-property):

public static string GetPropName<TResult>(Expression<Func<TResult>> expression)
{ 
    MemberExpression body = (MemberExpression)expression.Body;
    return body.Member.Name;
}

string staticPropName = Test.GetPropName(()=> Test.Prop); 

请注意,您需要进行检查,以确保表达式只是您期望的表达式,而不是() => Test + 42或更复杂的表达式,并报告错误。