Programovanie

Ako pracovať s odrazom v C #

Odraz v C # sa používa na načítanie metadát o typoch za behu. Inými slovami, reflexiou môžete dynamicky kontrolovať metadáta typov vo vašom programe - môžete načítať informácie o načítaných zostavách a typoch v nich definovaných. Odraz v C # je podobný RTTI (Runtime Type Information) v C ++.

Ak chcete pracovať s reflexiou v .Net, mali by ste do svojho programu zahrnúť menný priestor System.Reflection. Pri použití odrazu získate objekty typu „Typ“, ktoré možno použiť na predstavenie zostáv, typov alebo modulov. Odraz môžete použiť na dynamické vytvorenie inštancie typu a dokonca na vyvolanie metód typu.

Medzi typy definované v mennom priestore System.Reflection patria nasledujúce.

  • zhromaždenie
  • Modul
  • Enum
  • MethodInfo
  • ConstructorInfo
  • MemberInfo
  • ParameterInfo
  • Typ
  • FieldInfo
  • EventInfo
  • PropertyInfo

Poďme teraz kopať do nejakého kódu, aby sme uskutočnili reflexiu Zvážte nasledujúcu triedu s názvom Zákazník.

verejná trieda Zákazník

    {

public int Id

        {

dostať; sada;

        }

verejný reťazec FirstName

        {

dostať; sada;

        }

verejný reťazec Priezvisko

        {

dostať; sada;

        }

verejný reťazec Adresa

        {

dostať; sada;

        }

    }

Nasledujúci úryvok kódu ukazuje, ako môžete získať názov triedy a názov priestoru názvov triedy Customer pomocou odrazu:

Typ typ = typeof (Zákazník);

Console.WriteLine ("Trieda:" + typ.Názov);

Console.WriteLine ("Namespace:" + type.Namespace);

Nasledujúci úryvok kódu ilustruje, ako môžete načítať zoznam vlastností triedy Customer a zobrazovať ich mená v okne konzoly:

static void Main (reťazec [] args)

        {

Typ typ = typeof (Zákazník);

PropertyInfo [] propertyInfo = type.GetProperties ();

Console.WriteLine ("Zoznam vlastností triedy Customer je: -");

foreach (PropertyInfo pInfo v propertyInfo)

            {

Console.WriteLine (pInfo.Name);

            }

        }

Metóda GetProperties () triedy Type vracia pole typu PropertyInfo - toto je vlastne zoznam verejných vlastností vášho typu. Potom môžete toto pole iterovať a načítať názvy všetkých verejných vlastností definovaných vo vašom type. Pretože trieda Customer definuje tri vlastnosti, pri spustení tohto programu by sa v konzole zobrazili názvy všetkých týchto troch vlastností.

Tu je ukážka toho, ako môžeme pomocou odrazu zobraziť metadáta konštruktorov a verejné metódy typu. Znova sa vráťme k triede Zákazník, ktorú sme vytvorili predtým, a začleňme dve metódy - predvolený konštruktor a metódu s názvom Validovať, ktorá sa používa na overenie objektu zákazníka, ktorý mu bol odovzdaný ako parameter. Takto by vyzerala upravená verzia triedy Customer.

verejná trieda Zákazník

    {

verejný zákazník ()

        {

// Predvolený konštruktor

        }

public int Id

        {

dostať; sada;

        }

verejný reťazec FirstName

        {

dostať; sada;

        }

verejný reťazec Priezvisko

        {

dostať; sada;

        }

verejný reťazec Adresa

        {

dostať; sada;

        }

public bool Validate (Customer customerObj)

        {

// Kód na overenie objektu zákazníka

návrat pravdivý;

        }

    }

Nasledujúci úryvok kódu možno použiť na zobrazenie mien všetkých konštruktorov, ktoré patria do triedy Customer. V triede Zákazník máme iba jedného konštruktora, preto by bol uvedený iba jeden.

Typ typ = typeof (Zákazník);

ConstructorInfo [] constructorInfo = type.GetConstructors ();

Console.WriteLine ("Trieda Zákazník obsahuje nasledujúce konštruktory: -");

foreach (ConstructorInfo c v constructorInfo)

  {

Console.WriteLine (c);

  }

Všimnite si, že metóda GetConstructors () triedy Type vracia pole typu ConstructorInfo, ktoré obsahuje zoznam všetkých verejných konštruktorov definovaných v type, ktorý sa odráža.

OK; Poďme si teraz zobraziť názvy všetkých verejných metód triedy Customer - opäť tu máme len jednu, takže by sa pri vykonaní programu uvedeného ďalej v konzole zobrazil názov iba jednej metódy. Tu je zoznam kódov pre vašu referenciu.

static void Main (reťazec [] args)

 {

Typ typ = typeof (Zákazník);

MethodInfo [] methodInfo = type.GetMethods ();

  Console.WriteLine ("Metódy triedy Zákazník sú: -");

foreach (teplota metódyInfo v metódeInfo)

            {

Console.WriteLine (temp.Name);

            }

Console.Read ();

        }

Upozorňujeme, že môžete zobraziť aj názvy niekoľkých ďalších metód (ToString, Equals, GetHashCode, GetType). Tieto metódy sa dedia z triedy Object - ľubovoľná trieda v .Net štandardne odvodzuje triedu Object.

Môžete tiež iterovať pomocou atribútov metódy. Ak boli pre vaše metódy definované vlastné atribúty, môžete na získanie atribútov metódy použiť metódu GetCustomAttributes na inštancii triedy MethodInfo. Tu je príklad, ako to môžete dosiahnuť.

foreach (teplota metódyInfo v metódeInfo)

 {

foreach (atribút atribútu v temp.GetCustomAttributes (true))

     {

// Sem napíš obvyklý kód

     }

  }

Ak teda zdobíte svoje obchodné objekty pomocou atribútov vo svojej aplikácii, môžete využiť reflexiu na reflexiu typu, načítať atribúty metód vášho typu a potom podľa toho vykonať nejakú akciu.

$config[zx-auto] not found$config[zx-overlay] not found