#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;
}
}