【问题标题】:Is it possible to retrieve the variable name (not value) of a property using reflection?是否可以使用反射检索属性的变量名(不是值)?
【发布时间】:2019-02-02 09:56:09
【问题描述】:

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

我涉及三个课程

答:

class A 
{
    public B bObject;

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

乙:

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)”,然后由于冗余而调用该方法和道具。谢谢你的时间。

【问题讨论】:

  • 我会问为什么?但这是一个有趣的问题......
  • 编写模块以遵守第三方规范,这要求每个属性都有某种“标签”。模型的设置使得每个道具的“标签”也等于“bObject”名称。也许这里有一个更大的设计问题!
  • 我希望 objName 返回字符串“bObject.number”,在属性内调用的变量我不相信是可能的。您实际上是在尝试从返回值的代码行中提取名称。
  • 当编译器将其优化为 int Number => 3; 时会发生什么?代码检查最好留给在 IDE 中运行的工具,如果你想这样做,我建议查看 VS 插件和 Rosyln 代码分析器。
  • @JanWillemHuising 实际上,如果您按原样使用上面的代码,这将抛出 NullReferenceException,因为它没有被初始化。即使是这样,在发布模式下运行时,变量也可能被优化并可能被破坏。

标签: c# variables reflection properties nameof


【解决方案1】:

您在这里尝试做的是检索 Number 方法的主体,然后删除“return”和“;”只得到你想要的值。

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

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

这不是非常优雅,但它可以满足您的需求。

【讨论】:

    【解决方案2】:

    您可以定义自定义属性并在其中存储诸如“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多