我知道有很多方法,但是真的有好的方法吗?
目前我有一个体面的基于属性的框架,它工作得很好,除了冗长的:
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 kill排除了这个选项。也许有一种方法,我可以重写GetCurrentMethod在c#中,在不同的名称下?这是一个遗憾的StackCrawlMark(我认为是必需的)是内部的系统。
或者,是否有任何工具可以与ReSharper兼容,但可能让我通过护目镜查看代码,减少冗长的MethodBase。GetCurrentMethod到更短更甜的东西,同时仍然编译完全相同?(我真的不希望有预编译的繁琐步骤,但我愿意听取建议-将其全部简化为属性名称将是不错的)。
简而言之,没有。有各种各样的尝试,包括堆栈检查(GetCurrentMethod
)和lambda表达式,但最终它们都有点效率低下。
除非你需要混淆,否则我只会使用字符串- Get.Int("Value")
-这不太可能是一个真正的维护问题。
如果采用内联方法,则堆栈检查方法存在潜在的脆性;如果你需要混淆,我可能会用Expression
。或者直接将方法标记为"不要混淆此名称"。
另一种方法是拥有一个抽象基类型,并使用元编程在运行时根据检查属性,使用正确的数据/代码创建具体类型。