如何使下面显示的方法返回属性的名称
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”所以任何替代方案吗?
答案 0 :(得分:3)
在某种程度上,您需要确定要返回其名称的属性...如果只有一个,您可以使用此属性:
public string GetName()
{
return this.GetType().GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance)[0].Name;
}
答案 1 :(得分:3)
Here's一个类似的问题和答案,使用Expression创建NameOf&lt;&gt;操作
答案 2 :(得分:1)
正如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 :(得分:0)
您无法通过成员变量获取属性的名称 - 该变量只保存对字符串的引用,并且该字符串不知道该属性。
您可以做的是列出类中的所有属性并获取其名称。
答案 4 :(得分:0)
我真的看不出它的意义,但这可能是一种方法。下面的方法使用反射循环遍历该类型的所有属性,获取每个属性的值,并使用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
它们都将引用相同的字符串实例,因此上述方法无法确定哪个属性是所需的属性。正如它现在写的那样,它将返回它在数组中找到的第一个。