如何获得财产的名称

时间:2009-05-28 06:59:53

标签: c# reflection

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

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 个答案:

答案 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它们都将引用相同的字符串实例,因此上述方法无法确定哪个属性是所需的属性。正如它现在写的那样,它将返回它在数组中找到的第一个。

相关问题