2014-12-03 2 views
1
public sealed class test<T> : IEnumerable<T> where T : new() 
{ 
    public sealed class Ignore : Attribute { } 
}  

public class test_2 
{ 
    [ ???? ] 
    string helllo; 
} 

Есть ли способ получить доступ к Атрибуту за пределами класса test<T>? Я не могу найти его.Пользовательские атрибуты, созданные внутри общего класса

+0

Я считаю, что ваш класс должен быть назван IgnoreAttribute для правильной работы. – pquest

+1

'[test .Ignore]'. Вы должны указать тип для 'T'. Это связано с тем, что параметр типа 'T' доступен для вложенных типов, даже если ваши атрибуты не используют его. – vcsjones

+2

Это становится очень неудобным в использовании - почему в универсальном классе есть не общий атрибут? Включение атрибутов внутри классов на самом деле не является хорошей практикой – Rhumborl

ответ

1

C# не поддерживает общие атрибуты. Я знаю, что ваш атрибут не является общим, но я полагаю, что вы хотите, чтобы внутри этого универсального класса использовался T в уровне атрибута, что делает атрибут общим (вы получите различный тип Ignore для каждого T)

К сожалению, t достичь этого в C#. Why does C# forbid generic attribute types?

Обновлено из комментариев: В области пространства имен вы можете иметь атрибут Ignore. Вы можете сделать отражение на test<T> и искать свойства с атрибутом Ignore.

public sealed class Ignore : Attribute { } 

public sealed class test<T> : IEnumerable<T> where T : new() 
{ 
    [Ignore] 
    public test_2 SomeProperty { get; set; } 
} 


public class test_2 
{ 
    [Ignore] 
    public string TestData { get; set; } 
} 
+0

'общественного запечатан класс тест : IEnumerable где Т: новый() { общественных запечатан класс Игнорировать: Атрибут {}} общественного класс test_2 { [Тест .IGNORE] строки Helllo; } ' На самом деле нет, T совершенно неинтересным для атрибута, они даже не будут когда-либо быть рядом друг с другом в коде: D атрибут является только для идентификации ВАРА быть проигнорировано отражением' теста ' –

+0

Да, но вы могли бы это сделать, если бы захотели. C# не поддерживает это, чтобы избежать таких сложностей. Если они не связаны, почему вы хотите поместить атрибут внутри этого класса? – bbeda

+0

атрибут связан с 'test ', поэтому я хочу его там, но он необходим другим классам, так что пользователь может указать переменные, которые будут игнорироваться с помощью 'test ' –

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