2014-10-23 7 views
4

Я хочу написать мое перечисление с пользовательскими атрибутами, например:Тип ограничение в атрибутах

public enum SomeEnum: long 
{ 
    [SomeAttribute<MyClass1>] 
    Sms = 1, 
    [SomeAttribute<MyClass2>] 
    Email = 2 
} 

но атрибуты не поддерживает генерик. Ну, наиболее похожий раствор:

public enum SomeEnum: long 
{ 
    [SomeAttribute(typeof(MyClass1))] 
    Sms = 1, 
    [SomeAttribute(typeof(MyClass2))] 
    Email = 2 
} 

А вот проблема: я хочу Class1 наследоваться от ICustomInterface, так и с генериков я могу написать ограничение:

[AttributeUsage(AttributeTargets.All)] 
class SomeAttribute<T> : Attribute where T: ICustomInterface 
{ 
} 

но атрибуты не поддерживает дженерики.

так, наконец, вопрос: как я могу проверить время компиляции (например, T ограничений), что тип реализует некоторый интерфейс?

+0

Я думаю, что в этом случае самый простой способ - использовать ['Type.GetInterface'] (http://msdn.microsoft.com/en-us/library/tcctb9t8 (v = vs.110) .aspx) - но вы уверены, что вам нужно это внутри атрибута *? Я бы предположил, что это более удобно, если вы * что-то делаете * с классами, имеющими этот атрибут ... – Carsten

+0

Я уверен, что мне нужно ограничение для этого типа. Это логично вроде «AttributeUsage». Во время выполнения я могу проверить с помощью 'IsAssignableFrom', но это проверка времени выполнения. –

+0

Материал атрибута - это всегда время выполнения - некоторые исключения из этого (AttributeUsage и т. Д.) Являются ИМО жестко закодированными в компиляторе. – Carsten

ответ

4

Очень прост в ваш последний вопрос:

так, наконец, вопрос: как я могу проверить во время компиляции (например, T ограничения), что тип реализует некоторый интерфейс?

Вы не можете этого сделать.

Но вы можете проверить его во время выполнения, с некоторыми методами отражения, как: Type.IsAssignableFrom

0

В то время как я имел аналогичные проблемы, вы не получите время компиляции проверки для этого.

Сейчас это:

public class SomeAttribute : Attribute 
{ 
    public SomeAttribute(Type given) 
    { 
     Given = given; 
     Required = typeof (INotifyDataErrorInfo); 
    } 

    public Type Given { get; set; } 
    public Type Required { get; set; } 

    public bool Valid() 
    { 
     return Required.IsAssignableFrom(Given); 
    } 
} 

public enum TestEnum 
{ 
    [Some(typeof(string))] 
    Sms = 1, 
    [Some(typeof(string))] 
    Email = 2 
} 

Далеко, как ты собираешься получить, к сожалению.

Хотя, насколько я могу вспомнить, если вы используете PostSharp, существует способ вызвать зависящие от кода проверки времени компиляции, если это то, что вам нужно. Это может не указывать на недостатки визуально в вашей среде IDE, но по-прежнему гарантирует, что другие разработчики должны обеспечить передачу определенного типа.

Смежные вопросы