是否可以使用反射来检索属性的变量名(而不是值)?

时间:2018-08-27 20:20:58

标签: c# variables reflection properties nameof

我正在尝试检索属性的变量名称,而不是值。我目前正在使用反射,但是如果有人有其他建议,将不胜感激。

我参加了三堂课

A:

class A 
{
    public B bObject;

    int Number { return bObject.number; } //returns 3
}

B:

class B 
{   
    public int number = 3; 
}

C:

class C 
{
    public void myMethod() 
    {
        A aObject = new A();

        var aNumber = aObject
            .GetType()
            .GetProperty("Number")
            .GetValue(aObject, null);

        //this is the value. aNumber = 3.
        var objName = nameof(aNumber); //returns aNumber
    }

我希望 objName返回字符串“ bObject.number” ,该字符串是在属性内部调用的。我当前的设置是否可行?如果没有,是否有人提出建议?

我宁愿B中没有另一个方法返回“ nameof(bObject)+ nameof(bObject.number)”,然后由于冗余而同时调用该方法和prop。谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

您要在此处执行的操作是检索Number方法的主体,然后删除“ return”和“;”仅获得所需的值。

这里有一个很好的示例,展示了如何将方法的主体作为字符串获取: Getting a specific method source code from .cs file (at runtime)

完成后,您可以解析出“ return”和“;”得到你想要的。

这不是很优雅,但是可以满足您的要求。

答案 1 :(得分:0)

您可以定义自定义属性,并在其中存储“ bObject.number”之类的字符串。然后,也可以通过反射访问属性值。 https://docs.microsoft.com/ru-ru/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes

如果您认为两次编写相同的代码过于昂贵,请查看T4模板https://msdn.microsoft.com/ru-ru/library/bb126445.aspx