有点奇怪,但我的疯狂背后是有原因的。
我有一个资源,我已经设置了一些字符串属性,例如MenuAdminLabel
和MenuAccountsLabel
,分别具有"Admin"one_answers"Accounts"等值。我需要将标签属性名称传递到一个方法中,我很清楚我可以将这些作为"MenuAdminLabel"one_answers"MenuAccountsLabel"等字符串传递,但我希望这些由编译器验证,而不是简单的字符串,因为资源上有很多属性,我想确保每个引用都是正确的。
麻烦的是,如果我访问Resource.MenuAdminLabel
我(显然)获得资源属性的值,而不是属性名称,我可以通过使用typeof(Localisation.Resources).GetProperties()
访问属性列表,但是,再一次,我不得不使用文字字符串来获取属性名称,而不是使用Localisation.Resource.MenuAdminLabel
编译器可以验证的东西。
我该怎么做?
这是实现INotifyPropertyChanged时经常遇到的问题。解决方案是使用像
这样的lambda表达式。MyMethod(() => Localisation.MenuAdminLabel);
代替
MyMethod("MenuAdminLabel");
并分析表达式。在这个答案中可以找到一个示例实现。对于您的情况,它可能看起来像:
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
}