通过显式引用属性获取C#.NET资源属性名称

时间:2011-07-08 11:57:38

标签: .net reflection

有点奇怪,但我的疯狂背后有一个原因。

我已经设置了一些资源,其中包含一些字符串属性,例如MenuAdminLabelMenuAccountsLabel,其值分别为“Admin”和“Accounts”。我需要将标签属性名称传递给方法,我很清楚我可以像“MenuAdminLabel”和“MenuAccountsLabel”那样将它们作为字符串传递但我希望这些由编译器验证,而不是简单的字符串作为资源上会有很多属性,我想确保每个引用都是正确的。

问题是,如果我访问Resource.MenuAdminLabel我(显然)获取资源属性的值而不是属性名称,我可以使用typeof(Localisation.Resources).GetProperties()访问属性列表但是,我再次我必须使用文字字符串从此获取属性名称,而不是使用编译器可以验证的Localisation.Resource.MenuAdminLabel显式的内容。

我该怎么做?

1 个答案:

答案 0 :(得分:2)

这是实施INotifyPropertyChanged时经常遇到的问题。解决方案是使用像

这样的lambda表达式
MyMethod(() => Localisation.MenuAdminLabel);

而不是

MyMethod("MenuAdminLabel");

并分析表达。可以在this answer中找到一个示例实现。对于您的情况,它可能看起来像:

private void MyMethod<TValue>(Expression<Func<TValue>> propertySelector)
{
    var memberExpression = propertySelector.Body as MemberExpression;
    if (memberExpression == null)
        throw new ArgumentException();

    string name = memberExpression.Member.Name;

    // Do stuff with name

}