任何人都可以帮我解决这个问题:
public class MyClass
{
public int MyProperty{ get; set; }
private void MyMethod()
{
// here I wat to get the name of MyProperty.
// string name = "MyProperty"; <-- I don't want to hardcode it like this.
}
}
我不想硬编码。 它可以吗?
偷偷摸摸你
答案 0 :(得分:7)
一种选择是使用表达式树:
var name = ExpressionTrees.GetPropertyName<MyClass, int>(x => x.MyProperty);
...
public static class ExpressionTrees
{
public static string GetPropertyName<TSource, TTarget>
(Expression<Func<TSource, TTarget>> expression)
{
...
}
}
(替代方法可以帮助进行类型推断,但我会在这里切入追逐。)
如果您重命名MyProperty
,那么如果您将其作为重构,那么您在GetPropertyName
调用中的使用也会发生变化,否则您将遇到编译时失败。
Stack Overflow上有很多关于如何从表达式树中提取名称的帖子,但值得注意的是,这仍然存在潜在的缺陷方法 - 没有什么可以阻止你写作:
ExpressionTrees.GetPropertyName<MyClass, int>(x => 0);
您可以在执行时检测到,但不能在编译时检测到。还有性能问题 - 它不会可怕,但它可能不是理想。
根据您的要求(在这种情况下,您确切地想要识别该属性而不是另一个属性),其他方法可能会很好用,例如属性。