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 настраиваемый атрибут ко всем членам заданного типа, имена которых начинаются с "Кому". Чтобы запустить этот код, вставьте его в пустой проект консоли и обязательно включите ссылку на System.Reflection.Context.dll.

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

//Reflection context with custom rules.
class myCRC : 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")) {
                   yield return new myAttribute();
               }
               //Keep existing attributes as well.
               foreach (var attr in declaredAttributes) yield return attr;
         }
}

class Program
{
    static void Main(string[] args)
    {
        myCRC mc = new myCRC();
        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 all the members of the type and their attributes.
        foreach (MemberInfo m in myTI.DeclaredMembers)
        {
           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();

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

        Console.WriteLine();

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

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

        Console.ReadLine();
    }
}

Комментарии

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

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

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

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

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

CustomReflectionContext методы не должны обращаться к списку атрибутов отраженного объекта или метода напрямую путем вызова GetCustomAttributes метода в предоставленном MemberInfo или ParameterInfo экземпляре, но вместо этого следует использовать declaredAttributes список, который передается в качестве параметра перегрузкам GetCustomAttributes метода.

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

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

Будьте осторожны в отношении равенства между отраженными объектами при работе с контекстами отражения, так как объекты могут представлять один и тот же отраженный объект в нескольких контекстах. Этот метод можно использовать для MapType получения определенного контекста отражения версии отраженного объекта.

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

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

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

CustomReflectionContext()

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

CustomReflectionContext(ReflectionContext)

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

Методы

AddProperties(Type)

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

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

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

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

Создает объект, представляющий свойство, добавляемое к типу, для использования методом 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)

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