我知道有办法,但实际上是否有好的方式?
目前我有一个不错的基于属性的框架,除了冗长的例外情况外,它的工作非常好:
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缩减为更短更甜的东西,同时仍然编译完全相同? (我真的不想有一个预编译的步骤,但我愿意接受建议 - 将所有内容减少到属性名称会很好。)
答案 0 :(得分:0)
简而言之,没有。在这方面有各种尝试,包括堆栈检查(GetCurrentMethod
)和lambda表达式,但最终它们都有点低效。
除非你需要混淆,否则我只会使用一个字符串 - Get.Int("Value")
- 这不太可能是一个真正的维护问题。
如果内联的话,堆栈检查方法会有潜在的脆性;如果你需要混淆,我可能会选择Expression
。或者只是将方法标记为“不要混淆此名称”。
另一种方法是使用抽象基类型,并使用元编程在运行时根据检查属性创建具有正确数据/代码的具体类型。