CustomReflectionContext Класс

Определение

Представляет настраиваемый контекст отражения.

public ref class CustomReflectionContext abstract : System::Reflection::ReflectionContext
public abstract class CustomReflectionContext : System.Reflection.ReflectionContext
type CustomReflectionContext = class
    inherit ReflectionContext
Public MustInherit Class CustomReflectionContext
Inherits ReflectionContext
Наследование
CustomReflectionContext
Производный

Комментарии

CustomReflectionContext предоставляет способ добавления или удаления пользовательских атрибутов из объектов отражения или добавления фиктивных свойств в эти объекты без повторной реализации полной модели отражения. По умолчанию CustomReflectionContext объекты отражения просто упаковываются без внесения изменений, но путем подкласса и переопределения соответствующих методов можно добавлять, удалять или изменять атрибуты, которые применяются к любому отражаемому параметру или члену, или добавлять новые свойства в отраженный тип.

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

Для эффективного использования CustomReflectionContext код, использующий отраженные объекты, должен поддерживать понятие указания контекста отражения, а не предполагать, что все отраженные объекты связаны с контекстом отражения среды выполнения. Многие методы отражения в .NET предоставляют ReflectionContext параметр для этой цели.

Чтобы изменить атрибуты, применяемые к параметрам или членам в рамках рефлексии, переопределите метод GetCustomAttributes(ParameterInfo, IEnumerable<Object>) или GetCustomAttributes(MemberInfo, IEnumerable<Object>). Эти методы принимают отраженный объект и список атрибутов в текущем контексте отражения и возвращают список атрибутов, которые он должен иметь в пользовательском контексте отражения.

Предупреждение

CustomReflectionContext Переопределения не должны запрашивать атрибуты предоставленных MemberInfo или ParameterInfo вызывая GetCustomAttributes; используйте declaredAttributes последовательность, переданную GetCustomAttributes перегрузкам.

Чтобы добавить свойства в отраженный тип, переопределите метод AddProperties. Метод принимает параметр, указывающий отраженный тип, и возвращает список дополнительных свойств. Следует использовать метод CreateProperty, чтобы создать возвращаемые объекты свойств. Вы можете указать делегаты при создании свойства, которые служат аксессорами для доступа к этому свойству, и вы можете опустить один из аксессоров для создания свойства только для чтения или только для записи. Обратите внимание, что такие фиктивные свойства не имеют метаданных или поддержки Общего промежуточного языка (CIL).

Предупреждение

  • Будьте осторожны в отношении равенства между отраженными объектами при работе с контекстами отражения, так как объекты могут представлять один и тот же отраженный объект в нескольких контекстах. Вы можете использовать метод MapType для получения версии отраженного объекта в определенном контексте отражения.
  • Объект CustomReflectionContext изменяет атрибуты, возвращаемые определенным объектом отражения, например теми, которые получены методом GetCustomAttributes . Он не изменяет данные пользовательского атрибута, возвращаемые методом GetCustomAttributesData, и при использовании пользовательского контекста отражения эти два списка не будут совпадать.

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

// A blank example attribute.
class MyAttribute : Attribute
{
}

// Reflection context with custom rules.
class MyCustomReflectionContext : CustomReflectionContext
{
    // Called whenever the reflection context checks for custom attributes.
    protected override IEnumerable<object> GetCustomAttributes(MemberInfo member, IEnumerable<object> declaredAttributes)
    {
        // Add example attribute to "To*" members.
        if (member.Name.StartsWith("To", StringComparison.Ordinal))
        {
            yield return new MyAttribute();
        }
        // Keep existing attributes as well.
        foreach (object attr in declaredAttributes)
        {
            yield return attr;
        }
    }
}
MyCustomReflectionContext mc = new();
Type t = typeof(string);

// A representation of the type in the default reflection context.
TypeInfo ti = t.GetTypeInfo();

// A representation of the type in the customized reflection context.
TypeInfo myTI = mc.MapType(ti);

// Display affected members of the type ("To*") and their attributes.
foreach (MemberInfo m in myTI.DeclaredMembers.Where(static m => m.Name.StartsWith("To", StringComparison.Ordinal)))
{
    Console.WriteLine($"{m.Name}:");
    foreach (Attribute cd in m.GetCustomAttributes())
    {
        Console.WriteLine(cd.GetType());
    }
}

Console.WriteLine();

// The "ToString" member as represented in the default reflection context.
MemberInfo mi1 = ti.GetDeclaredMethods("ToString").FirstOrDefault();

Attribute[] defaultAttributes = mi1.GetCustomAttributes().ToArray();

// All the attributes of "ToString" in the default reflection context.
Console.WriteLine("'ToString' Attributes in Default Reflection Context:");
foreach (Attribute cd in defaultAttributes)
{
    Console.WriteLine(cd.GetType());
}

Console.WriteLine();

// The same member in the custom reflection context.
mi1 = myTI.GetDeclaredMethods("ToString").FirstOrDefault();

Attribute[] customAttributes = mi1.GetCustomAttributes().ToArray();

// All its attributes, for comparison. MyAttribute is now included.
Console.WriteLine("'ToString' Attributes in Custom Reflection Context:");
foreach (Attribute cd in customAttributes)
{
    Console.WriteLine(cd.GetType());
}

Конструкторы

Имя Описание
CustomReflectionContext()

Инициализирует новый экземпляр класса CustomReflectionContext.

CustomReflectionContext(ReflectionContext)

Инициализирует новый экземпляр CustomReflectionContext класса с указанным контекстом отражения в качестве основы.

Методы

Имя Описание
AddProperties(Type)

При переопределении в производном классе предоставляет коллекцию дополнительных свойств для указанного типа, как представлено в этом контексте отражения.

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>)

Создает объект, представляющий свойство, добавляемое в тип, для использования с AddProperties(Type) методом и использования заданных настраиваемых атрибутов.

CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>)

Создает объект, представляющий свойство, добавляемое в тип, для использования с методом AddProperties(Type) .

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetCustomAttributes(MemberInfo, IEnumerable<Object>)

При переопределении в производном классе предоставляет список пользовательских атрибутов для указанного элемента, как представлено в этом контексте отражения.

GetCustomAttributes(ParameterInfo, IEnumerable<Object>)

При переопределении в производном классе предоставляет список настраиваемых атрибутов для указанного параметра, как представлено в этом контексте отражения.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает Type текущего экземпляра.

(Унаследовано от Object)
GetTypeForObject(Object)

Возвращает представление типа указанного объекта в этом контексте отражения.

(Унаследовано от ReflectionContext)
MapAssembly(Assembly)

Получает представление в этом контексте отражения сборки, представленной объектом из другого контекста отражения.

MapType(TypeInfo)

Получает представление в этом контексте отражения типа, представленного объектом из другого контекста отражения.

MemberwiseClone()

Создает неглубокую копию текущей Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к