This article has been localized into Russian by the community.
Создание экземпляра класса
До сих пор мы работали с уже созданными .NET типами или объектами. Но с отражением мы можем создавать экземпляры и во время выполнения, зная имя класса, который мы хотим создать. Есть несколько способов сделать это, но я предпочитаю получить ссылку на конструктор, который я хочу использовать, вызвать его, а затем использовать возвращенное значение в качестве моего экземпляра. Вот пример того, как это сделать. Сначала код, потом я все объясню:
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;
}
}
}
Я определил простой класс для тестирования этого, называемый TestClass. Он просто содержит личное поле и открытый метод. Метод возвращает значение частного свойства, к которому добавляется значение параметра. Теперь нам нужно создать новый экземпляр этого TestClass, вызвать TestMethod и вывести результат на консоль.
В этом примере мы можем позволить себе роскошь использовать typeof () непосредственно на TestClass, но в какой-то момент вам, возможно, придется сделать это исключительно с помощью имени нужного класса. В этом случае можно получить ссылку на него через сборку, в которой он объявлен, как показано в главе о типе.
Таким образом, со ссылкой на Тип класса мы запрашиваем конструктор по умолчанию с помощью метода GetConstructor (), передавая System.Тип.EmptyTypes в качестве параметра. В случае, если нам нужен конкретный конструктор, мы должны предоставить массив типов, каждый из которых определяет, какой параметр конструктора мы ищем.
Как только у нас есть ссылка на конструктор, мы просто вызываем метод Invoke () для создания нового экземпляра класса TestClass. Мы передаем null в качестве параметра для вызова (), так как мы не хотим указывать какие-либо параметры. Мы используем GetMethod (), вместе с именем метода, который мы хотим, чтобы получить функцию TestMethod (), а затем мы еще раз используем магию метода Invoke () для вызова этой функции. На этот раз нам нужно указать параметр в виде массива объектов. Мы делаем это на лету, указывая число 10 в качестве единственного параметра, который нам нужен, и затем выводим результат вызова метода. Все это благодаря магии отражения!