CustomReflectionContext Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Představuje přizpůsobitelný kontext reflexe.
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
- Dědičnost
- Odvozené
Příklady
Následující příklad ukazuje, jak podtřídu CustomReflectionContext přidat vlastní atribut do všech členů daného typu, jejichž názvy začínají na "To". Pokud chcete tento kód spustit, vložte ho do prázdného projektu konzoly a nezapomeňte zahrnout odkaz na 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();
}
}
Poznámky
CustomReflectionContext poskytuje způsob, jak přidat nebo odebrat vlastní atributy z objektů reflexe nebo přidat fiktivní vlastnosti do těchto objektů, aniž by bylo nutné znovu implementovat úplný model reflexe. Výchozí nastavení CustomReflectionContext jednoduše zabalí objekty reflexe bez provedení jakýchkoli změn, ale podtřídou a přepsáním příslušných metod můžete přidat, odebrat nebo změnit atributy, které platí pro jakýkoli odražený parametr nebo člen, nebo přidat nové vlastnosti do odraženého typu.
Předpokládejme například, že se váš kód řídí konvencí použití určitého atributu na metody továrny, ale teď musíte pracovat s kódem třetích stran, který nemá atributy. Můžete použít CustomReflectionContext k určení pravidla pro identifikaci objektů, které by měly mít atributy, a k zadání objektů s těmito atributy při zobrazení z kódu.
Aby bylo možné efektivně používat CustomReflectionContext kód, který používá reflektované objekty, musí podporovat pojem určení kontextu reflexe, namísto předpokladu, že všechny reflektované objekty jsou přidruženy k kontextu reflexe modulu runtime. Mnoho metod reflexe v rozhraní .NET Framework poskytuje ReflectionContext parametr pro tento účel.
Chcete-li upravit atributy, které jsou použity pro odražený parametr nebo člen, přepište metodu GetCustomAttributes(ParameterInfo, IEnumerable<Object>) nebo GetCustomAttributes(MemberInfo, IEnumerable<Object>) . Tyto metody převezmou reflektovaný objekt a seznam atributů v aktuálním kontextu reflexe a vrátí seznam atributů, které by měly mít v kontextu vlastní reflexe.
Upozornění
CustomReflectionContext Metody by neměly přistupovat k seznamu atributů odraženého objektu nebo metody přímo voláním GetCustomAttributes metody v zadané MemberInfo nebo ParameterInfo instanci, ale měly by místo toho použít declaredAttributes
seznam, který je předán jako parametr GetCustomAttributes přetížení metody.
Chcete-li přidat vlastnosti k reflektovaným typům, přepište metodu AddProperties . Metoda přijímá parametr, který určuje odražený typ, a vrátí seznam dalších vlastností. Měli byste použít metodu CreateProperty k vytvoření objektů vlastností, které se mají vrátit. Delegáty můžete zadat při vytváření vlastnosti, která bude sloužit jako přistupná vlastnost, a pokud chcete vytvořit vlastnost jen pro čtení nebo jen pro zápis, můžete jedno z přistupů vynechat. Všimněte si, že tyto fiktivní vlastnosti nemají žádná metadata ani podporu CIL (Common Intermediate Language).
Upozornění
Při práci s kontexty odrazu buďte opatrní, pokud jde o rovnost odražených objektů, protože objekty mohou představovat stejný odražený objekt v několika kontextech. Můžete použít metodu MapType k získání konkrétního kontextu reflexe verze odraženého objektu.
Upozornění
Objekt CustomReflectionContext změní atributy vrácené určitým objektem reflexe, například atributy získané metodou GetCustomAttributes . Nemění data vlastního atributu vrácená metodou GetCustomAttributesData a tyto dva seznamy se při použití kontextu vlastní reflexe neshodují.
Konstruktory
CustomReflectionContext() |
Inicializuje novou instanci CustomReflectionContext třídy. |
CustomReflectionContext(ReflectionContext) |
Inicializuje novou instanci CustomReflectionContext třídy se zadaným kontextem reflexe jako základ. |
Metody
AddProperties(Type) |
Při přepsání v odvozené třídě poskytuje kolekci dalších vlastností pro zadaný typ, jak je znázorněno v tomto kontextu reflexe. |
CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>) |
Vytvoří objekt, který představuje vlastnost, která má být přidána do typu, pro použití s metodou AddProperties(Type) . |
CreateProperty(Type, String, Func<Object,Object>, Action<Object,Object>, IEnumerable<Attribute>, IEnumerable<Attribute>, IEnumerable<Attribute>) |
Vytvoří objekt, který představuje vlastnost, která má být přidána do typu, pro použití s metodou AddProperties(Type) a pomocí zadaných vlastních atributů. |
Equals(Object) |
Určí, zda se zadaný objekt rovná aktuálnímu objektu. (Zděděno od Object) |
GetCustomAttributes(MemberInfo, IEnumerable<Object>) |
Při přepsání v odvozené třídě, poskytuje seznam vlastních atributů pro zadaného člena, jak je znázorněno v tomto kontextu reflexe. |
GetCustomAttributes(ParameterInfo, IEnumerable<Object>) |
Při přepsání v odvozené třídě poskytuje seznam vlastních atributů pro zadaný parametr, jak je znázorněno v tomto kontextu reflexe. |
GetHashCode() |
Slouží jako výchozí hashovací funkce. (Zděděno od Object) |
GetType() |
Získá aktuální Type instanci. (Zděděno od Object) |
GetTypeForObject(Object) |
Získá reprezentaci typu zadaného objektu v tomto kontextu reflexe. (Zděděno od ReflectionContext) |
MapAssembly(Assembly) |
Získá reprezentaci v tomto kontextu reflexe sestavení, který je reprezentován objektem z jiného kontextu reflexe. |
MapType(TypeInfo) |
Získá reprezentaci, v tomto kontextu reflexe, typ reprezentovaný objektem z jiného kontextu reflexe. |
MemberwiseClone() |
Vytvoří mělkou kopii aktuálního Objectsouboru . (Zděděno od Object) |
ToString() |
Vrátí řetězec, který představuje aktuální objekt. (Zděděno od Object) |