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
Uwagi
CustomReflectionContext zapewnia możliwość dodawania lub usuwania atrybutów niestandardowych z obiektów odbicia lub dodawania fikcyjnych właściwości do tych obiektów bez ponownego implementowania kompletnego modelu odbicia. Domyślne CustomReflectionContext po prostu zawija obiekty odbicia bez wprowadzania żadnych zmian, ale poprzez utworzenie podklasy i zastąpienie odpowiednich metod, można dodawać, usuwać lub zmieniać atrybuty dotyczące dowolnego odbitego parametru lub elementu członkowskiego, lub dodać nowe właściwości do odbitego 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żesz użyć CustomReflectionContext aby określić regułę identyfikowania obiektów, które powinny mieć atrybuty, oraz nadawania tym obiektom tych atrybutów podczas ich wyświetlania w kodzie.
Aby efektywnie używać CustomReflectionContext, kod używający odzwierciedlonych obiektów musi obsługiwać pojęcie określania kontekstu refleksji, zamiast zakładać, że wszystkie odzwierciedlone obiekty są skojarzone z kontekstem refleksji środowiska uruchomieniowego. Wiele metod odbicia w .NET udostępnia 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ą obiekt podlegający odbiciu i listę atrybutów w jego bieżącym kontekście odbicia i zwracają listę atrybutów, które powinny znajdować się zgodnie z niestandardowym kontekstem odbicia.
Warning
CustomReflectionContext przesłonięcia nie powinny wykonywać zapytań względem atrybutów podanych MemberInfo lub ParameterInfo przez wywołanie metody GetCustomAttributes; zamiast tego użyj declaredAttributes sekwencji przekazanej GetCustomAttributes do przeciążeń.
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. Należy użyć metody CreateProperty, aby utworzyć obiekty właściwości do zwrócenia. Delegatów można określić podczas tworzenia właściwości, która 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 wsparcia w postaci wspólnego języka pośredniego (CIL, Common Intermediate Language).
Warning
- Należy zachować ostrożność co do równości między odzwierciedlonymi obiektami podczas pracy z kontekstami odbicia, ponieważ obiekty mogą reprezentować ten sam odzwierciedlony obiekt w wielu kontekstach. Można użyć MapType metody , aby uzyskać wersję określonego kontekstu odbicia obiektu odzwierciedlonego.
- Obiekt CustomReflectionContext zmienia atrybuty zwracane przez określony obiekt odbicia, na przykład te uzyskane przez metodę GetCustomAttributes . Nie zmienia ona danych atrybutów niestandardowych zwracanych przez GetCustomAttributesData metodę, a te dwie listy nie będą zgodne w przypadku użycia niestandardowego kontekstu odbicia.
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".
// 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());
}
Konstruktory
| Nazwa | Opis |
|---|---|
| CustomReflectionContext() |
Inicjuje nowe wystąpienie klasy CustomReflectionContext. |
| CustomReflectionContext(ReflectionContext) |
Inicjuje nowe wystąpienie CustomReflectionContext klasy z określonym kontekstem odbicia jako bazą. |
Metody
| Nazwa | Opis |
|---|---|
| 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 AddProperties(Type) metodą 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 AddProperties(Type) metodą . |
| 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) |