有点奇怪,但我的疯狂背后有一个原因。
我已经设置了一些资源,其中包含一些字符串属性,例如MenuAdminLabel
和MenuAccountsLabel
,其值分别为“Admin”和“Accounts”。我需要将标签属性名称传递给方法,我很清楚我可以像“MenuAdminLabel”和“MenuAccountsLabel”那样将它们作为字符串传递但我希望这些由编译器验证,而不是简单的字符串作为资源上会有很多属性,我想确保每个引用都是正确的。
问题是,如果我访问Resource.MenuAdminLabel
我(显然)获取资源属性的值而不是属性名称,我可以使用typeof(Localisation.Resources).GetProperties()
访问属性列表但是,我再次我必须使用文字字符串从此获取属性名称,而不是使用编译器可以验证的Localisation.Resource.MenuAdminLabel
显式的内容。
我该怎么做?
答案 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
}