Спасибо за это, Гаэль. Я не сталкивался с PostSharp до сегодняшнего дня. Я добавлю это в свой список рождественских исследований.
оторых местах я заметил, что деревья выражений передаются в качестве аргументов в методы, позволяющие компилятору проверять имена свойств. Например, Caliburn Micro имеет следующую сигнатуру метода в своем классе PropertyChangedBase:
public virtual void NotifyOfPropertyChange<TProperty>(Expression<Func<TProperty>> property);
У меня есть пользовательский атрибут, который я хотел бы иметь тот же тип проверки компилятором имен свойств в конструкторе, чтобы я мог набрать:
[MyCustomAttribute(() => PropertyName)]
Вместо:
[MyCustomAttribute("PropertyName")]
Используя определение конструктора в соответствии с:
public MyCustomAttribute(params Expression<Func<object>>[] properties)
Однако из-за ограничения параметров атрибутов, являющихся константными выражениями, это представляется невозможным.
Может ли кто-нибудь порекомендовать другой подход, при котором я могу заставить компилятор проверять имена свойств в параметрах моего атрибута, а не оставлять эту потенциальную ошибку, когда используются только строки?
Редактировать: Благодаря ответу Марка, я реализовал это сейчас:
#if DEBUG
foreach (var propertyInfo in
GetType().GetProperties().Where(propertyInfo => Attribute.IsDefined(propertyInfo, typeof (MyCustomAttribute))))
{
foreach (var propertyName in propertyInfo.GetAttributes<MyCustomAttribute>(true)
.SelectMany(attribute => attribute.PropertyNames))
Debug.Assert(
GetType().GetProperty(propertyName) != null,
"Property not found",
"Property {0} declared on attributed property {1} was not found on type {2}.",
propertyName, propertyInfo.Name, GetType().Name
);
}
#endif