Атрибуты на поле в классе - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу получить список полей с атрибутом Sync.Field для каждого поля в классе.Поле может / не может иметь атрибут Sync.Field

Я пробовал следующее, но у меня возникли проблемы с получением настраиваемого атрибута для каждого поля.

FieldInfo[] fiClass = typClass.GetFields();

FieldInfo[] lst = fiClass
                   .Where(c => c.CustomAttribute().GetType() == typeOf(Sync.Field))
                   .ToList();

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если у вас есть FieldInfo, вы можете получить экземпляр его атрибута, используя этот код:

var attr = fieldInfo.GetCustomAttributes().OfType<Sync.FieldAttribute>().SingleOrDefault();

См. Мой пример на DotNetFiddle .

0 голосов
/ 26 февраля 2019

У меня есть общий класс коллекции, который использует класс данных для сопоставления таблицы SNMP с полями класса данных.Like JsonProperty сопоставляет десериализованные значения свойствам.Таким же образом я определяю SNMPPropertyAttribute.Сам атрибут:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
  sealed class SNMPPropertyAttribute : Attribute
  {
    public SNMPPropertyAttribute(string propertyOID) => PropertyOID = new ObjectIdentifier(propertyOID);

    public ObjectIdentifier PropertyOID { get; }
  }

Когда в конструкторе таблиц я делаю словарь полей данных и их OID из атрибута:

public SNMPTableEntity()
    {
      snmpPoperties = new Dictionary<ObjectIdentifier, PropertyInfo>();
      foreach (PropertyInfo myProperty in GetType().GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public))
      {
        CustomAttributeData snmpAttribure = myProperty.CustomAttributes.Where(x => x.AttributeType == typeof(SNMPPropertyAttribute)).FirstOrDefault();
        if (snmpAttribure != null)
          snmpPoperties.Add(new ObjectIdentifier((string)snmpAttribure.ConstructorArguments[0].Value), myProperty);
      }
    }

Это похоже на то, чтоВы пытаетесь заболеть, так что, надеюсь, это поможет.Но разница в том, что я использую свойства, а не поля.Не уверен, что это имеет большое значение, но ...

Есть пример использования:

  public class InterfaceTableEntity : SNMPTableEntity
  {
    /// <summary>
    /// A unique value for each interface.  Its value ranges between 1 and the value of ifNumber.  The value for each interface must remain constant at least from one re-initialization of the entity's network management system to the next re- initialization.
    /// </summary>
    [SNMPProperty("1.3.6.1.2.1.2.2.1.1")]
    protected Integer32 ifIndex { get; set; }
    /// <summary>
    /// A textual string containing information about the interface.  This string should include the name of the manufacturer, the product name and the version of the hardware interface.
    /// </summary>
    [SNMPProperty("1.3.6.1.2.1.2.2.1.2")]
    protected OctetString ifDescr { get; set; }
    /// <summary>
    /// The type of interface, distinguished according to the physical/link protocol(s) immediately `below' the network layer in the protocol stack.
    /// </summary>
    [SNMPProperty("1.3.6.1.2.1.2.2.1.3")]
    protected Integer32 ifType { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...