.Net: как я могу получить пользовательские атрибуты с помощью TypeDescriptor.Получить свойства?

#.net #custom-attributes #typedescriptor

#.net #пользовательские атрибуты #typedescriptor

Вопрос:

Я создал свой собственный атрибут для украшения своего объекта.

  [AttributeUsage(AttributeTargets.All)]
    public class MyCustomAttribute : System.Attribute { }
  

Когда я пытаюсь использовать TypeDescriptor.GetProperties, передаваемый в моем пользовательском атрибуте, ничего не возвращает, даже если тип украшен атрибутом.

   var props = TypeDescriptor.GetProperties(
              type, 
              new[] { new Attributes.FlatLoopValueInjection()});
  

Как мне получить TypeDescriptor.Получить свойства для распознавания моих пользовательских типов?

Ответ №1:

Тип.Метод GetProperties(type, Attributes[]) возвращает только набор свойств для указанного типа компонента, используя указанный массив атрибутов в качестве фильтра.
Вы уверены, что целевой тип имеет свойства, отмеченные вашими пользовательскими атрибутами, например, так?

 //...
    var props = TypeDescriptor.GetProperties(typeof(Person), new Attribute[] { new NoteAttribute() });
    PropertyDescriptor nameProperty = props["Name"];
}
//...
class Person {
    [Note]
    public string Name { get; set; }
}
//...
class NoteAttribute : Attribute {
/* implementation */
}
  

Ответ №2:

обновлено, чтобы получить атрибут свойства

этот код был скопирован и вставлен из MSDN, что стало первым результатом поиска Google «get customattribute reflection c #«

 using System;

public class ExampleAttribute : Attribute
{
    private string stringVal;

    public ExampleAttribute()
    {
        stringVal = "This is the default string.";
    }

    public string StringValue
    {
        get { return stringVal; }
        set { stringVal = value; }
    }
}

[Example(StringValue="This is a string.")]
class Class1
{
    public static void Main()
    {
        PropertyInfo propertyInfo = typeof (Class1).GetProperties().Where(p => p.Name == "Foo").FirstOrDefault();
        foreach (object attrib in propertyInfo.GetCustomAttributes(true))
        {
            Console.WriteLine(attrib);
        }
    }

    [Example(StringValue = "property attribute")]
    public string Foo {get;set;}
}
  

Комментарии:

1. Не мое, но я думаю, что он пытается получить доступ к атрибутам свойств, а не к самим классам.

2. TypeDescriptor можно ввести свойства позже. Это похоже на расширяемую версию Reflection . Если TypeDescriptor это то, что нужно OP, то этот ответ неверен.