Спасибо за это, Гаэль. Я не сталкивался с 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

Ответы на вопрос(1)

Ваш ответ на вопрос