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 implementowania kompletnego modelu odbicia. Domyślne CustomReflectionContext po prostu opakowuje obiekty odbicia bez wprowadzania żadnych zmian, ale przez podklasę i zastąpienie odpowiednich metod, można dodawać, usuwać lub zmieniać atrybuty, które mają zastosowanie do 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. CustomReflectionContext Służy do określania reguły identyfikowania obiektów, które powinny mieć atrybuty, oraz do podawania obiektów z tymi atrybutami podczas wyświetlania ich z poziomu kodu.
Aby efektywnie korzystać CustomReflectionContext , kod korzystający z odbitych obiektów 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 .NET Framework dostarcza ReflectionContext parametr do tego celu.
Aby zmodyfikować atrybuty, które są stosowane do odbitego parametru lub elementu członkowskiego, przesłoń metodę GetCustomAttributes(ParameterInfo, IEnumerable<Object>) or GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Te metody przyjmują odbity obiekt 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 GetCustomAttributes metody w podanym MemberInfo wystąpieniu lub ParameterInfo , ale zamiast tego należy użyć declaredAttributes
listy, która jest przekazywana jako parametr do GetCustomAttributes przeciążeń metody.
Aby dodać właściwości do typu odbitego, zastąpij metodę AddProperties . Metoda akceptuje parametr określający odbity typ i zwraca listę dodatkowych właściwości. Należy użyć CreateProperty metody , aby utworzyć obiekty właściwości do zwrócenia. 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 tworzenia kopii zapasowych języka wspólnego języka pośredniego (CIL).
Ostrzeżenie
Podczas pracy z kontekstami odbicia należy zachować ostrożność, ponieważ obiekty mogą reprezentować ten sam odbity obiekt w wielu kontekstach. Można użyć MapType metody , aby uzyskać wersję określonego kontekstu odbicia obiektu odbitego.
Ostrzeżenie
CustomReflectionContext Obiekt 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 CustomReflectionContext nowe wystąpienie klasy z określonym kontekstem odbicia jako bazą. |
Metody
AddProperties(Type) |
Podczas zastępowania w klasie pochodnej zapewnia 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>) |
Tworzy obiekt, który reprezentuje właściwość do dodania do typu, który ma być używany z AddProperties(Type) metodą . |
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. |
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (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>) |
Podczas zastępowania 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() |
Type Pobiera wartość 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 Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |