Как создать динамическое создание объекта и вызвать метод в .NET 3.5
-
20-08-2019 - |
Вопрос
Как выглядит код, который бы создавал объект класса:
string myClass = "MyClass";
Вышеуказанного типа, а затем вызовите
string myMethod = "MyMethod";
На этом объекте?
Решение
- Использовать
Type.GetType(string)
чтобы получить объект типа. - Использовать
Activator.CreateInstance(Type)
чтобы создать экземпляр. - Использовать
Type.GetMethod(string)
чтобы получить метод. - Использовать
MethodBase.Invoke(object, object[])
вызвать метод объекта
Пример, но без проверки ошибок:
using System;
using System.Reflection;
namespace Foo
{
class Test
{
static void Main()
{
Type type = Type.GetType("Foo.MyClass");
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("MyMethod");
method.Invoke(instance, null);
}
}
class MyClass
{
public void MyMethod()
{
Console.WriteLine("In MyClass.MyMethod");
}
}
}
Каждый шаг требует тщательной проверки — вы можете не найти тип, у него может не быть конструктора без параметров, вы можете не найти метод, вы можете вызвать его с неправильными типами аргументов.
Следует отметить одну вещь:Type.GetType(string) требуется имя типа с указанием сборки, если только оно не находится в текущей исполняемой сборке или mscorlib.
Другие советы
Я создал библиотеку, которая упрощает создание и вызов динамических объектов с использованием .NET. Вы можете скачать библиотеку и код в коде Google: Помощник позднего связыванияВ проекте вы найдете Wiki-страница с использованием, или вы также можете проверить это статья в CodeProject
Используя мою библиотеку, ваш пример будет выглядеть так:
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();
Или даже короче:
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
.Method("MyMethod")
.Invoke();
Он использует удобный интерфейс и действительно упрощает такого рода операции.Надеюсь, вы найдете это полезным.
Ниже предполагается, что объект имеет открытый конструктор и общедоступный метод, который возвращает некоторое значение, но не принимает никаких параметров.
var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
Предполагая, что ваш класс находится в вашей исполняемой сборке, ваш конструктор и ваш метод не имеют параметров.
Type clazz = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyClass");
System.Reflection.ConstructorInfo ci = clazz.GetConstructor(new Type[] { });
object instance = ci.Invoke(null); /* Send parameters instead of null here */
System.Reflection.MethodInfo mi = clazz.GetMethod("MyMethod");
mi.Invoke(instance, null); /* Send parameters instead of null here */