Самый сжатый способ получить атрибут члена без экземпляра объекта [duplicate]

вы можете использовать встроенную функцию list ():

newlist=list(oldlist)

Я думаю, этот код вам поможет.

24
задан Jess 12 June 2014 в 18:45
поделиться

3 ответа

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

    public object GetIDForPassedInObject(T obj)
    {
        var prop = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
                   .FirstOrDefault(p => p.GetCustomAttributes(typeof(IdentifierAttribute), false).Count() ==1);
        object ret = prop !=null ?  prop.GetValue(obj, null) : null;

        return ret;
    }  
32
ответ дан Richard Friend 21 August 2018 в 10:00
поделиться
  • 1
    спасибо - не могу использовать "prop" в лямбда в FirstOrDefault, но я ее отсортировал :-) – Alex 20 July 2010 в 12:10
  • 2
    Ах, да, писал это в блокноте ;-) исправлено. – Richard Friend 20 July 2010 в 12:17
  • 3
    Я пометил свое свойство с помощью [Идентификатор ()], но .GetProperties () возвращает все остальные свойства, ЗА ИСКЛЮЧЕНИЕМ этого! мой атрибут, похоже, скрывает его? – Alex 20 July 2010 в 13:49
  • 4
    Попробуйте указать флаги привязки, такие как GetProperties (BindingFlags.Public | BindingFlags.Instance); – Richard Friend 20 July 2010 в 14:05

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

public enum TransactionTypeEnum
{
    [Description("Text here!")]
    DROP = 1,

    [Description("More text here!")]
    PICKUP = 2,

    ...
}

Получение значения:

var code = TransactionTypeEnum.DROP.ToCode();

Расширение, поддерживающее все мои перечисления:

public static string ToCode(this TransactionTypeEnum val)
{
    return GetCode(val);
}

public static string ToCode(this DockStatusEnum val)
{
    return GetCode(val);
}

public static string ToCode(this TrailerStatusEnum val)
{
    return GetCode(val);
}

public static string ToCode(this DockTrailerStatusEnum val)
{
    return GetCode(val);
}

public static string ToCode(this EncodingType val)
{
    return GetCode(val);
}

private static string GetCode(object val)
{
    var attributes = (DescriptionAttribute[])val.GetType().GetField(val.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), false);

    return attributes.Length > 0 ? attributes[0].Description : string.Empty;
}
0
ответ дан PmanAce 21 August 2018 в 10:00
поделиться
  • 1
    Для тех, кто голосует, объясните, почему. – PmanAce 5 April 2018 в 13:51
public class TestClass<T>
{
    public void GetIDForPassedInObject(T obj)
    {
        PropertyInfo[] properties =
            obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);            

        PropertyInfo IdProperty = (from PropertyInfo property in properties
                           where property.GetCustomAttributes(typeof(Identifier), true).Length > 0
                           select property).First();

         if(null == IdProperty)
             throw new ArgumentException("obj does not have Identifier.");

         Object propValue = IdProperty.GetValue(entity, null)
    }
}
2
ответ дан this. __curious_geek 21 August 2018 в 10:00
поделиться
Другие вопросы по тегам:

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