【发布时间】: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