Добавление пользовательского атрибута в системный класс

#reflection #types #attributes #reflection.emit

#отражение #типы #атрибуты #отражение.испускать

Вопрос:

Я хочу добавить классы из System.Activites.Presentation моего пользовательского атрибута. Я пытался сделать это с emit(TypeBuilder, ModuleBuilder, AssemblyBuilder) помощью . Можно ли изменить существующий тип, добавив к нему атрибут? Или как сообщить TypeBuilder , чтобы он использовал существующий тип данных? Или наследовать от заданного типа? Спасибо.

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

1. о каких классах вы говорите? Помечены ли они как «запечатанные»? Если нет, вы можете создать свой собственный пользовательский класс на основе исходного и добавить пользовательские атрибуты

2. Класс из пространства имен Windows. Система. Действия. Я хочу добавить свой пользовательский атрибут DisplayName (строка)

Ответ №1:

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

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

 [MyAttribute(DisplayName="Name shown")]
public class MyActivity: System.Activities.Activity
{
}
/// <summary>
/// Custom attribute definition
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public sealed class MyAttribute : System.Attribute
{


    /// <summary>
    /// Defines the attribute
    /// </summary>
         public string DisplayName { get; set; }
    /// <summary>
    /// Allow access to the attribute
    /// </summary>
    /// <param name="prop"></param>
    /// <returns></returns>
      public static string GetDisplayName(System.Reflection.MemberInfo prop)
    {
        string field = null;
        object[] attr = prop.GetCustomAttributes(false);
        foreach (object a in attr)
        {
            MyAttribute additional = a as MyAttribute;
            if (additional != null)
            {
                field = additional.DisplayName;
            }
        }
        return field;
    }


}