TOC

This article has been localized into Czech by the community.

Reflexe:

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!


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!