有没有一个获得当前属性名称的好方法?

时间:2011-04-10 07:40:56

标签: c# reflection properties

我知道有办法,但实际上是否有好的方式?

目前我有一个不错的基于属性的框架,除了冗长的例外情况外,它的工作非常好:

public Variable<int> Value { get { return Get.Int(MethodBase.CurrentMethod()); } }

图片,*几百(经常也有制定者)。反正有没有得到相同的结果,但更简洁?

我考虑过:

public Variable<int> Value { get { return Get.Int("Value"); } }

并尝试:

public Variable<int> Value { get { return Get.Int(() => Value); } }

但是因为有很多很多这些变量(我保证会有这种疯狂的方法)我担心第二个值(或字符串)与第一个不匹配会产生的模糊错误。

所以我的问题是,有人能想到一个更简洁的方式来写上面的内容吗?我只需要当前的属性名称。

到目前为止,我最喜欢的“解决方案”是:

protected Func<MethodBase> Self = MethodBase.GetCurrentMethod;
public Variable<int> Value { get { return Get.Int(Self()); } }

这是短暂,甜蜜,漂亮的。

但是,JIT杀死了作为一种选择的规则。是否有一种方法可以用不同的名称在C#中重写GetCurrentMethod?遗憾的是StackCrawlMark(我认为是必需的)是System内部的。

或者,是否有任何与ReSharper兼容的工具,但也许让我通过护目镜查看代码,将详细的MethodBase.GetCurrentMethod缩减为更短更甜的东西,同时仍然编译完全相同? (我真的不想有一个预编译的步骤,但我愿意接受建议 - 将所有内容减少到属性名称会很好。)

1 个答案:

答案 0 :(得分:0)

简而言之,没有。在这方面有各种尝试,包括堆栈检查(GetCurrentMethod)和lambda表达式,但最终它们都有点低效。

除非你需要混淆,否则我只会使用一个字符串 - Get.Int("Value") - 这不太可能是一个真正的维护问题。

如果内联的话,堆栈检查方法会有潜在的脆性;如果你需要混淆,我可能会选择Expression。或者只是将方法标记为“不要混淆此名称”。

另一种方法是使用抽象基类型,并使用元编程在运行时根据检查属性创建具有正确数据/代码的具体类型