Reflection in C # is used to retrieve metadata on types at runtime. Jinými slovy můžete reflexi použít k dynamické kontrole metadat typů v programu - můžete načíst informace o načtených sestavách a typech v nich definovaných. Reflexe v C # je podobná RTTI (Runtime Type Information) v C ++.
Chcete-li pracovat s odrazem v .Net, měli byste do svého programu zahrnout jmenný prostor System.Reflection. Při použití reflexe získáte objekty typu „Type“, které lze použít k reprezentaci sestav, typů nebo modulů. Pomocí reflexe můžete dynamicky vytvořit instanci typu a dokonce vyvolat metody typu.
Typy definované v oboru názvů System.Reflection zahrnují následující.
- Shromáždění
- Modul
- Výčet
- MethodInfo
- ConstructorInfo
- MemberInfo
- ParametrInfo
- Typ
- FieldInfo
- EventInfo
- PropertyInfo
Pojďme nyní kopat do nějakého kódu, abychom provedli odraz v akci. Zvažte následující třídu nazvanou Zákazník.
veřejná třída Zákazník
{
public int Id
{
dostat; soubor;
}
veřejný řetězec FirstName
{
dostat; soubor;
}
veřejný řetězec Příjmení
{
dostat; soubor;
}
veřejný řetězec Adresa
{
dostat; soubor;
}
}
Následující fragment kódu ukazuje, jak pomocí reflexe můžete získat název třídy a název oboru názvů třídy Customer:
Typ typ = typeof (zákazník);
Console.WriteLine ("Třída:" + typ.Název);
Console.WriteLine ("Namespace:" + type.Namespace);
Následující fragment kódu ukazuje, jak můžete načíst seznam vlastností třídy Customer a zobrazit jejich názvy v okně konzoly:
static void Main (řetězec [] args)
{
Typ typ = typeof (zákazník);
PropertyInfo [] propertyInfo = type.GetProperties ();
Console.WriteLine ("Seznam vlastností třídy Customer je: -");
foreach (PropertyInfo pInfo v propertyInfo)
{
Console.WriteLine (pInfo.Name);
}
}
Metoda GetProperties () třídy Type vrací pole typu PropertyInfo - toto je vlastně seznam veřejných vlastností vašeho typu. Poté můžete toto pole iterovat a načíst názvy všech veřejných vlastností definovaných ve vašem typu. Protože třída Customer definuje tři vlastnosti, názvy všech těchto tří vlastností by se při spuštění tohoto programu zobrazily v konzole.
Zde je ukázka, jak můžeme zobrazit metadata konstruktorů a veřejné metody typu pomocí reflexe. Podívejme se znovu na třídu Customer, kterou jsme vytvořili dříve, a začleňme dvě metody - výchozí konstruktor a metodu nazvanou Validate, která se používá k ověření objektu zákazníka předaného jako parametr. Takto by vypadala upravená verze třídy Customer.
veřejná třída Zákazník
{
veřejný zákazník ()
{
// Výchozí konstruktor
}
public int Id
{
dostat; soubor;
}
veřejný řetězec FirstName
{
dostat; soubor;
}
veřejný řetězec Příjmení
{
dostat; soubor;
}
veřejný řetězec Adresa
{
dostat; soubor;
}
public bool Validate (Customer customerObj)
{
// Kód k ověření objektu zákazníka
návrat true;
}
}
Následující fragment kódu lze použít k zobrazení názvů všech konstruktorů, které patří do třídy Customer. Ve třídě Customer máme pouze jednoho konstruktora - proto by byl uveden pouze jeden.
Typ typ = typeof (zákazník);
ConstructorInfo [] constructorInfo = type.GetConstructors ();
Console.WriteLine ("Třída Customer obsahuje následující konstruktory: -");
foreach (ConstructorInfo c v constructorInfo)
{
Console.WriteLine (c);
}
Všimněte si, že metoda GetConstructors () třídy Type vrací pole typu ConstructorInfo, které obsahuje seznam všech veřejných konstruktorů definovaných v typu, který se odráží.
OK; Pojďme nyní zobrazit názvy všech veřejných metod třídy Customer - opět máme jen jednu, takže by se při spuštění programu uvedeného dále zobrazil v konzole název pouze jedné metody. Zde je seznam kódů pro vaši referenci.
static void Main (řetězec [] args)
{
Typ typ = typeof (zákazník);
MethodInfo [] methodInfo = type.GetMethods ();
Console.WriteLine ("Metody třídy Customer jsou: -");
foreach (teplota metodyInfo v metoděInfo)
{
Console.WriteLine (temp.Name);
}
Console.Read ();
}
Všimněte si, že můžete také zobrazit názvy několika dalších metod (ToString, Equals, GetHashCode, GetType). Tyto metody se dědí z třídy Object - libovolná třída v .Net ve výchozím nastavení odvozuje třídu Object.
Můžete také iterovat prostřednictvím atributů metody. Pokud byly pro vaše metody definovány vlastní atributy, můžete k načtení atributů metody použít metodu GetCustomAttributes na instanci třídy MethodInfo. Tady můžete dosáhnout.
foreach (teplota metodyInfo v metoděInfo)
{
foreach (atribut atributu v temp.GetCustomAttributes (true))
{
// Sem napište obvyklý kód
}
}
Pokud tedy své obchodní objekty zdobíte pomocí atributů ve vaší aplikaci, můžete využít reflexe k reflexi typu, načíst atributy metod vašeho typu a podle toho provést nějakou akci.