Programování

Jak pracovat s odrazem v C #

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.