Получить член, к которому атрибут был применен из конструктора атрибутов? - PullRequest
14 голосов
/ 19 февраля 2010

У меня есть пользовательский атрибут, внутри конструктора моего пользовательского атрибута я хочу установить значение свойства моего атрибута для типа свойства, к которому был применен мой атрибут, есть ли какой-то доступ к члену, к которому относится атрибутбыл применен внутри моего класса атрибутов?

Ответы [ 3 ]

15 голосов
/ 19 февраля 2010

Атрибуты не работают таким образом, я боюсь.Они являются просто «маркерами», прикрепленными к объектам, но не способными взаимодействовать с ними.

Сами атрибуты обычно должны быть лишены поведения, просто содержат метаданные для типа, к которому они прикреплены.Любое поведение, связанное с атрибутом, должно обеспечиваться другим классом, который ищет наличие атрибута и выполняет задачу.

Если вас интересует тип, к которому применяется атрибут, эта информация будет доступна по адресув то же время вы размышляете, чтобы получить атрибут.

9 голосов
/ 29 ноября 2017

Это возможно из .NET 4.5 с использованием CallerMemberName:

[SomethingCustom]
public string MyProperty { get; set; }

Тогда ваш атрибут:

[AttributeUsage(AttributeTargets.Property)]
public class SomethingCustomAttribute : Attribute
{
    public StartupArgumentAttribute([CallerMemberName] string propName = null)
    {
        // propName = "MyProperty"
    }
}
0 голосов
/ 21 июня 2016

Вы можете сделать дальше. Это простой пример.

//target class
public class SomeClass{

    [CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
    public string Link { get; set; }

    public string DisplayName { get; set; }
}
    //custom attribute
    public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
    public string ProperytName { get; set; }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var propertyValue = "Value";
        var parentMetaData = ModelMetadataProviders.Current
             .GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
        var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
        if (property != null)
            propertyValue = property.Model.ToString();

        yield return new ModelClientValidationRule
        {
            ErrorMessage = string.Format(ErrorMessage, propertyValue),
            ValidationType = "required"
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...