CustomReflectionContext Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Reprezentuje dostosowywalny kontekst odbicia.
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
- Dziedziczenie
- Pochodne
Przykłady
W poniższym przykładzie pokazano, jak podklasy CustomReflectionContext dodać atrybut niestandardowy do wszystkich elementów członkowskich danego typu, których nazwy zaczynają się od "Do". Aby uruchomić ten kod, wklej go w pustym projekcie konsoli i upewnij się, że dołącz odwołanie do 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();
}
}
Uwagi
CustomReflectionContext umożliwia dodawanie lub usuwanie atrybutów niestandardowych z obiektów odbicia lub dodawanie fikcyjnych właściwości do tych obiektów bez ponownego zaimplementowania kompletnego modelu odbicia. Domyślny CustomReflectionContext po prostu opakowuje obiekty odbicia bez wprowadzania żadnych zmian, ale przez podklasy i przesłanianie odpowiednich metod, można dodawać, usuwać lub zmieniać atrybuty, które mają zastosowanie do dowolnego odzwierciedlonego parametru lub elementu członkowskiego, lub dodać nowe właściwości do odzwierciedlonego typu.
Załóżmy na przykład, że kod jest zgodny z konwencją stosowania określonego atrybutu do metod fabrycznych, ale teraz musisz pracować z kodem innej firmy, który nie ma atrybutów. Można użyć CustomReflectionContext, aby określić regułę identyfikacji obiektów, które powinny mieć atrybuty i podać obiekty z tymi atrybutami, gdy są one wyświetlane z kodu.
Aby efektywnie używać CustomReflectionContext, kod, który używa odzwierciedlone obiekty, musi obsługiwać pojęcie określania kontekstu odbicia, zamiast zakładać, że wszystkie odzwierciedlone obiekty są skojarzone z kontekstem odbicia środowiska uruchomieniowego. Wiele metod odbicia w programie .NET Framework zapewnia ReflectionContext parametr w tym celu.
Aby zmodyfikować atrybuty stosowane do odzwierciedlonego parametru lub elementu członkowskiego, przesłoń metodę GetCustomAttributes(ParameterInfo, IEnumerable<Object>) lub GetCustomAttributes(MemberInfo, IEnumerable<Object>). Metody te przyjmują odzwierciedlonego obiektu i listę atrybutów w bieżącym kontekście odbicia i zwracają listę atrybutów, które powinny znajdować się w niestandardowym kontekście odbicia.
Ostrzeżenie
CustomReflectionContext metody nie powinny uzyskiwać dostępu do listy atrybutów odzwierciedlonego obiektu lub metody bezpośrednio przez wywołanie metody GetCustomAttributes w podanym wystąpieniu MemberInfo lub ParameterInfo, ale zamiast tego należy użyć listy declaredAttributes
, która jest przekazywana jako parametr do przeciążeń metody GetCustomAttributes.
Aby dodać właściwości do typu odzwierciedlonego, zastąpij metodę AddProperties. Metoda akceptuje parametr określający odzwierciedlonego typu i zwraca listę dodatkowych właściwości. Aby utworzyć obiekty właściwości do zwrócenia, należy użyć metody CreateProperty. Można określić delegatów podczas tworzenia właściwości, która będzie służyć jako metoda dostępu do właściwości, i można pominąć jeden z metod dostępu, aby utworzyć właściwość tylko do odczytu lub tylko do zapisu. Należy pamiętać, że takie fikcyjne właściwości nie mają żadnych metadanych ani kopii zapasowych wspólnego języka pośredniego (CIL).
Ostrzeżenie
Należy zachować ostrożność co do równości między odzwierciedlonych obiektów podczas pracy z kontekstami odbicia, ponieważ obiekty mogą reprezentować ten sam odzwierciedlone obiekty w wielu kontekstach. Można użyć metody MapType, aby uzyskać wersję określonego kontekstu odbicia obiektu odbitego.
Ostrzeżenie
Obiekt CustomReflectionContext zmienia atrybuty zwracane przez określony obiekt odbicia, takie jak te uzyskane przez metodę GetCustomAttributes. Nie zmienia ona danych atrybutów niestandardowych zwracanych przez metodę GetCustomAttributesData, a te dwie listy nie będą zgodne w przypadku użycia niestandardowego kontekstu odbicia.
Konstruktory
CustomReflectionContext() |
Inicjuje nowe wystąpienie klasy CustomReflectionContext. |
CustomReflectionContext(ReflectionContext) |
Inicjuje nowe wystąpienie klasy CustomReflectionContext z określonym kontekstem odbicia jako bazą. |
Metody
AddProperties(Type) |
Po zastąpieniu w klasie pochodnej udostępnia kolekcję dodatkowych właściwości dla określonego typu, jak pokazano w tym kontekście odbicia. |
CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>) |
Tworzy obiekt reprezentujący właściwość do dodania do typu, który ma być używany z metodą AddProperties(Type) i przy użyciu określonych atrybutów niestandardowych. |
CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>) |
Tworzy obiekt reprezentujący właściwość, która ma zostać dodana do typu, który ma być używany z metodą AddProperties(Type). |
Equals(Object) |
Określa, czy określony obiekt jest równy bieżącemu obiektowi. (Odziedziczone po Object) |
GetCustomAttributes(MemberInfo, IEnumerable<Object>) |
Po zastąpieniu w klasie pochodnej udostępnia listę atrybutów niestandardowych dla określonego elementu członkowskiego, jak pokazano w tym kontekście odbicia. |
GetCustomAttributes(ParameterInfo, IEnumerable<Object>) |
Po zastąpieniu w klasie pochodnej udostępnia listę atrybutów niestandardowych dla określonego parametru, jak pokazano w tym kontekście odbicia. |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Pobiera Type bieżącego wystąpienia. (Odziedziczone po Object) |
GetTypeForObject(Object) |
Pobiera reprezentację typu określonego obiektu w tym kontekście odbicia. (Odziedziczone po ReflectionContext) |
MapAssembly(Assembly) |
Pobiera reprezentację w tym kontekście odbicia zestawu reprezentowanego przez obiekt z innego kontekstu odbicia. |
MapType(TypeInfo) |
Pobiera reprezentację w tym kontekście odbicia typu reprezentowanego przez obiekt z innego kontekstu odbicia. |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Object. (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |