Как передать класс и имя метода как строки и вызвать метод этого класса?Как динамически вызывать метод класса в .NET?
Как
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
Благодарности
Как передать класс и имя метода как строки и вызвать метод этого класса?Как динамически вызывать метод класса в .NET?
Как
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
Благодарности
Вы хотите использовать reflection.
Вот простой пример:
using System;
using System.Reflection;
class Program
{
static void Main()
{
caller("Foo", "Bar");
}
static void caller(String myclass, String mymethod)
{
// Get a type from the string
Type type = Type.GetType(myclass);
// Create an instance of that type
Object obj = Activator.CreateInstance(type);
// Retrieve the method you are looking for
MethodInfo methodInfo = type.GetMethod(mymethod);
// Invoke the method on the instance we created above
methodInfo.Invoke(obj, null);
}
}
class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
Теперь это очень простой пример, лишенный контроля ошибок, а также игнорирует большие проблемы, как то, что делать, если тип живет в другой сборке, но я думаю, это должно привести вас к правильному пути.
Что-то вроде этого:
public object InvokeByName(string typeName, string methodName)
{
Type callType = Type.GetType(typeName);
return callType.InvokeMember(methodName,
BindingFlags.InvokeMethod | BindingFlags.Public,
null, null, null);
}
Вы должны изменить обязательные флаги в соответствии с методом, который вы хотите позвонить, а также проверить метод Type.InvokeMember в MSDN, чтобы быть уверенным, что вам действительно нужно.
-1 Это не компилируется. –
Вы правы, мои извинения. Отредактировано для добавления аргументов метода, которые нельзя опустить (C# 4.0, где вы) :) –
Какова ваша причина для этого? Скорее всего, вы можете сделать это без отражения, вплоть до динамической загрузки сборки.
До тех пор, пока сборка загружена, а имя типа соответствует требованиям сборки, вы золотые. –
Хм ... Я ', нахожу, что ваш пример возвращает null в «Type.GetType (myclass);» – pistacchio
Это потому, что сборка, содержащая myclass, еще не загружена в appdomain. Вам нужно будет получить имя сборки от вызывающего и сделать Assembly.LoadFrom или один из многих вариантов для загрузки сборки в первую очередь. – Will