Как выглядит код, который создаст объект класса:
string myClass = "MyClass";
из вышеуказанного типа, а затем вызовет
string myMethod = "MyMethod";
На этот объект?
Как выглядит код, который создаст объект класса:
string myClass = "MyClass";
из вышеуказанного типа, а затем вызовет
string myMethod = "MyMethod";
На этот объект?
Type.GetType(string)
to get the type object. для получения объекта типа. Activator.CreateInstance(Type)
to create an instance. для создания экземпляра. Type.GetMethod(string)
to retrieve a method. для извлечения метода. MethodBase.Invoke(object, object[])
to invoke the method on the 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 (строка) нуждается в сборке квалифицированного имени типа, если он находится в настоящее время выполнения сборки или mscorlib.
Следующее предполагает объект с общественным конструктором и общедоступным методом, который возвращает определенное значение, но не принимает параметров.
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 */
Используя мою библиотеку, ваш пример будет выглядеть следующим образом:
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();
Или еще короче:
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
.Method("MyMethod")
.Invoke();
Он использует беглый интерфейс, и действительно упрощает этот вид операций. Я надеюсь, что вы могли бы найти его полезным.
Я создал библиотеку, которая упрощает динамическое создание объектов и вызов с помощью .NET вы можете скачать библиотеку и код в коде Google: Late Binding Helper In the project you will find a