Пользовательские атрибуты и проверка типов - PullRequest
0 голосов
/ 29 июня 2010

Поскольку я не видел ответа на этот вопрос в своем поиске по Google и сайту, я подумал, что я бы высказал это мнение на этом сайте.

Поскольку C # не поддерживает общие атрибуты (что имеет смысл)Мне было интересно, если есть способ ограничить тип аргумента / свойства атрибутом на основе типа, который он украшает.Пример:

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindAttribute : Attribute
{
    public string ColumnName { get; set; }
    public object DefaultValue { get; set; }
}

[ColumnBind(ColumnName = "Category", DefaultValue = "No Category")]
public int CategoryId { get; set; }

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

Заранее спасибо

1 Ответ

2 голосов
/ 29 июня 2010

Насколько я знаю, не существует способа принудительной проверки конкретного типа для отдельного свойства атрибута. Однако, и позвольте мне отметить, что это не самое элегантное решение, вы можете использовать полиморфизм в ваших интересах:

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindAttribute: Attribute
{
    public string ColumnName { get; set; }
    public object DefaultUntypedValue 
    {
        get;
        protected set;
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class ColumnBindGenericAttribute<T> : ColumnBindAttribute
{    
    public T DefaultValue 
    { 
        get { return (T)DefaultUntypedValue; }
        set { DefaultUntypedValue = value; }
    }
}

[AttributeUsage(AttributeTargets.Property)]    
public class ColumnBindInt32Attribute: ColumnBindGenericAttribute<int> {}

[ColumnBindInt32(ColumnName = "Category", DefaultValue = 100)]
public int CategoryId { get; set; }

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

РЕДАКТИРОВАТЬ:

Извиняюсь. Код не будет компилироваться, если какой-либо универсальный тип, прямо или косвенно, получен из типа Attribute. Это делает класс ColumnBindGenericAttribute невозможным. Я думал, что нашел дыру в компиляторе ... оказывается, умнее меня. : P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...