This article has been localized into Czech by the community.
Vytvoření instance třídy
Dosud jsme pracovali s již instancovanými typy nebo objekty .NET. Ale s reflexí můžeme instancování provádět také za běhu, známe-li název třídy, kterou chceme instancovat. Existuje několik způsobů, jak to udělat, ale preferuji získání odkazu na konstruktor, který chci použít, jeho vyvolání a poté použití vrácené hodnoty jako mé instance. Zde je příklad právě toho. Nejprve kód, pak to vše vysvětlím:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ReflectionTest
{
class Program
{
static void Main(string[] args)
{
Type testType = typeof(TestClass);
ConstructorInfo ctor = testType.GetConstructor(System.Type.EmptyTypes);
if(ctor != null)
{
object instance = ctor.Invoke(null);
MethodInfo methodInfo = testType.GetMethod("TestMethod");
Console.WriteLine(methodInfo.Invoke(instance, new object[] { 10 }));
}
Console.ReadKey();
}
}
public class TestClass
{
private int testValue = 42;
public int TestMethod(int numberToAdd)
{
return this.testValue + numberToAdd;
}
}
}
Definoval jsem jednoduchou třídu pro testování, nazvanou TestClass. Obsahuje jednoduše privátní pole a veřejnou metodu. Metoda vrací hodnotu privátní vlastnosti s přičtenou hodnotou parametru. Nyní chceme vytvořit novou instanci této třídy TestClass, zavolat TestMethod a výsledek vypsat na konzoli.
V tomto příkladu máme tu výhodu, že můžeme přímo použít typeof() na TestClass, ale v některém okamžiku může být nutné to provést pouze pomocí názvu požadované třídy. V takovém případě můžete získat na ni odkaz prostřednictvím sestavení, ve kterém je deklarována, jak bylo ukázáno v kapitole o Type (Typu).
Takže s odkazem Type na třídu požádáme o výchozí konstruktor použitím metody GetConstructor(), předáme jako parametr System.Type.EmptyTypes. V případě, že bychom chtěli konkrétní konstruktor, museli bychom poskytnout pole Type, kde by byl definován parametr, který by konstruktor měl přijmout.
Jakmile máme odkaz na konstruktor, jednoduše zavoláme metodu Invoke() k vytvoření nové instance třídy TestClass. Jako parametr k Invoke() předáme null, protože nechceme specifikovat žádné parametry. Používáme GetMethod() spolu s názvem metody, kterou chceme, abychom získali funkci TestMethod(), a pak opět využíváme kouzlo metody Invoke() k volání této funkce. Tentokrát potřebujeme specifikovat parametr ve formě pole objektů. Uděláme to na místě, specifikujeme číslo 10 jako jediný potřebný parametr a poté vypíšeme výsledek volání metody. Vše prostřednictvím kouzla Reflexe!