代码之家  ›  专栏  ›  技术社区  ›  Usman Masood

如何获取属性名称

  •  1
  • Usman Masood  · 技术社区  · 15 年前

    如何使下面显示的方法返回属性的名称

    public class MyClass
    {
    private string _MyProperty = "TEST";
    
    public string MyProperty
    {
        get { return _MyProperty; }
        set { _MyProperty = value; }
    }
    
    public string GetName()
    {
        return _MyProperty;  // <- should return "MyProperty";
    }
    

    }

    我不想使用返回“myproperty”,还有其他选择吗?

    5 回复  |  直到 15 年前
        1
  •  3
  •   Community uzul    7 年前

    Here's 使用表达式创建<gt;运算符名称的类似问题和答案。

        2
  •  3
  •   Javier Suero Santos JiminyCricket    15 年前

    在某种程度上,您需要标识要返回其名称的属性…如果只有一个可以使用:

    public string GetName()
    {
    return this.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[0].Name;
    }
    
        3
  •  1
  •   Ahmed    15 年前

    正如Rythmis所说,无法通过成员变量获取属性的名称。但是,下面是如何列出类中的所有属性:

        public class MyClass {
        private string _MyProperty = "TEST";
    
        public string MyProperty {
            get { return _MyProperty; }
            set { _MyProperty = value; }
        }
    
        public void GetName() {
            Type t = this.GetType();
            PropertyInfo[] pInfos = t.GetProperties();
            foreach(PropertyInfo x in pInfos)
                Console.WriteLine(x.Name);
    
        }
    }
    
        4
  •  0
  •   Rytmis    15 年前

    不能通过成员变量获取属性的名称——该变量只包含对字符串的引用,而字符串不知道该属性。

    你什么 可以 Do是列出 得到他们的名字。

        5
  •  0
  •   Fredrik Mörk    15 年前

    我真的看不到它的意义,但这可能是一种方法。下面的方法使用反射来循环类型的所有属性,获取每个属性的值,并使用referenceEquals检查属性是否引用与请求的对象相同的对象:

    private string _myProperty = "TEST";
    public string MyProperty
    {
        get
        {
            return _myProperty;
        }
    }
    
    public string GetName(object value)
    {
        PropertyInfo[] properties = this.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
        for (int i = 0; i < properties.Length; i++)
        {
            object propValue = properties[i].GetValue(this, null);
            if (object.ReferenceEquals(propValue,value))
            {
                return properties[i].Name;
            }
        }
    
        return null;
    }
    
    Console.WriteLine(GetName(this.MyProperty)); // outputs "MyProperty"
    

    但这离故障保护还很远。假设类有两个字符串属性,即MyProperty和YourProperty。如果我们在某个时候这样做: this.MyProperty = this.YourProperty 它们都引用同一个字符串实例,因此上述方法无法确定需要哪个属性。正如现在所写,它将返回在数组中找到的第一个。