【问题标题】:How to get the name of property [duplicate]如何获取属性的名称[重复]
【发布时间】:2010-10-29 12:07:06
【问题描述】:

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

public class MyClass
{
private string _MyProperty = "TEST";

public string MyProperty
{
    get { return _MyProperty; }
    set { _MyProperty = value; }
}

public string GetName()
{
    return _MyProperty;  // <- should return "MyProperty";
}

}

我不想使用 return "MyProperty" 所以还有其他选择吗?

【问题讨论】:

  • 请问您希望达到什么目标?
  • 我必须将属性名称传递给我正在创建的某个方法......基本上它的恢复以前的值是一种技巧。
  • 我明白,但我很好奇该属性的名称可能用于其他代码。也许,这不是一个棘手的问题,而是设计中的一个缺陷......在我知道你需要实现什么以及是否有更好的方法之前,我不能肯定地说。

标签: c# reflection


【解决方案1】:

您需要以某种方式确定要返回其名称的属性...如果只有一个,您可以使用:

public string GetName()
{
return this.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[0].Name;
}

【讨论】:

  • 但是如果只有一个属性而没有其他功能,那么使用 KeyValuePair 会更有意义。 :)
  • 这是一个简单的例子,如果我有多个属性而不是你的方法将失败......
【解决方案2】:

正如 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);

    }
}

【讨论】:

    【解决方案3】:

    你无法通过成员变量获取属性的名称——该变量只是保存了对字符串的引用,而字符串不知道该属性。

    可以做的是列出一个中的所有属性并获取它们的名称。

    【讨论】:

      【解决方案4】:

      我真的看不出它的意义,但这可能是一种方法。下面的方法使用反射循环遍历该类型的所有属性,获取每个属性的值并使用 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 它们都将引用同一个字符串实例,因此上述方法无法确定哪个属性是想要的。正如现在所写的那样,它将返回它在数组中找到的第一个。

      【讨论】:

      • 我想到了 :) 但如果我的类对两个不同的属性具有相同的值,它将失败......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 2013-09-11
      • 1970-01-01
      • 2011-02-15
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多