【问题标题】:Is there a good way to get the current property name?有没有获取当前属性名称的好方法?
【发布时间】:2011-08-02 09:30:33
【问题描述】:

我知道有办法,但真的有的办法吗?

目前我有一个不错的基于属性的框架,除了冗长之外,它运行良好:

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

想象一下,* 几百(通常也有 setter)。有没有办法得到同样的结果但更简洁?

我考虑过:

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 减少到更短更甜的东西,同时仍然编译完全相同? (我真的不希望有一个预编译摆弄步骤,但我愿意接受建议 - 将其全部简化为属性名称会很好)。

【问题讨论】:

    标签: c# reflection properties


    【解决方案1】:

    简而言之,没有。对此有各种尝试,包括堆栈检查 (GetCurrentMethod) 和 lambda 表达式,但最终都效率低下。

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

    如果采用内联堆栈检查方法,它可能会变得脆弱;如果您需要混淆,我可能会选择Expression。或者只是将该方法标记为“不要混淆此名称”。

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

    【讨论】:

    • 感谢 Marc,有点令人失望 - 我第一次发现自己渴望 C 的#define。在前两个中,我肯定会在字符串上使用表达式,因为速度不是一个真正的问题——只有正确性才是,而字符串——和 ReSharper 一样好——让我有点害怕。但是..你的最后一个建议是赢家。非常强大 - 属性被简化为“get”和可选的“set”,我可以确保这些属性表现良好。我很喜欢。问候。
    猜你喜欢
    • 2016-03-13
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多