Как соглашаться на стоимость признака в поле?

Понимая, что у меня есть следующий признак:

[System.AttributeUsage(AttributeTargets.Field)]
public class Unique : Attribute
{
    public bool IsUnique {get;set;}
    public Unique(bool x) { IsUnique = x; }
}

И поле, в котором я хочу осуществить вышеупомянутый признак:

public class TablaUsuarios
{
    [Unique(true)]
    public int ID;
}

Как я могу соглашаться на стоимость свойства IsUnique признака?

1
задан 01.04.2016, 18:49
2 ответа

Для этого случая в особенности (еще более короткая и читабельная версия, благодаря Леандро Туттини) и принимая, что признак Unique существует 0 или 1 раз в поле ID. Кроме того, если признак не присутствует в поле ID он возвратит null

Unique uniqueAttribute = (Unique)typeof(TablaUsuarios)
                            .GetField("ID")
                            .GetCustomAttribute(typeof(Unique));

bool? unique = uniqueAttribute?.IsUnique;

Заметь: Это решение использует синтаксис C# 6. Иначе úlitma линия - эквивалентный этой:

bool? unique = uniqueAttribute != null ? uniqueAttribute.IsUnique : (bool?)null;
0
ответ дан 24.11.2019, 14:40
  • 1
    Этот soluci и # 243; n - особенно м и # 225; s c и # 243; мода, когда я только хочу согласиться на свойство в специфическом средстве, но код Леандро Туттини - pr и # 225; ctico в списках и договоренностях, нет? – NaCl 30.03.2016, 23:15
  • 2
    Первый versi и # 243; n c и # 243; я говорю о Леандро, что он пробегает поля TablaUsuario и потом из-за каждого поля он пробегает Ваши признаки. Он не имеет общее со списками или договоренностями – Carlos Muñoz 30.03.2016, 23:16
  • 3
    Ох уже! Я это не увидел полностью, спасибо! – NaCl 30.03.2016, 23:18

Имея класс ты можешь использовать Reflection, чтобы соглашаться на признак.

Аксессинг Аттрибутес by Усинг Рефлектион (C # and Visual Basic)

Аксессинг Кустом Attributes

Si ты получаешь typeof класса ты мог бы получать свойства этой и потом признаки

Type t = typeof(TablaUsuarios);

var fields = t.GetFields();

foreach(var field in fields)
{
    foreach (ver attr in field.GetCustomAttributes(true))
    { 
        //aqui recorres los atributos de las propiedades 
    }
}

Другая более короткая альтернатива

Type t = typeof(TablaUsuarios);

var result = (Unique)t.GetField("ID").GetCustomAttributes(true).FirstOrDefault(x=> x.GetType() == typeof(Unique));

bool isunique = result.IsUnique;
0
ответ дан 24.11.2019, 14:40

Теги

Похожие вопросы