Поделиться через


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

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