Немного неясно, хотите ли вы определить тип во время выполнения и определить методы для него или хотите ли вы создать экземпляр из уже написанный тип, и вызывает методы для него.
К счастью, оба возможны.
Второй сценарий более вероятен, поэтому вам следует взглянуть на рефлексию (ниже) - но учтите, что с этим связаны ограничения производительности (и такие мелкие вещи, как «какие аргументы принимает метод», становятся очень важными) .
Для первого сценария вам нужно взглянуть на TypeBuilder
, но это намного более сложно. Другим вариантом будет CSharpCodeProvider
и динамическая загрузка сборки, но опять-таки - нетривиально ни при каких условиях.
using System;
namespace MyNamespace {
public class Foo {
public void Bar() {
Console.WriteLine("Foo.Bar called");
}
}
}
class Program {
static void Main() {
string className = "MyNamespace.Foo, MyAssemblyName",
methodName = "Bar";
Type type = Type.GetType(className);
object obj = Activator.CreateInstance(type);
type.GetMethod(methodName).Invoke(obj, null);
}
}
Чтобы включить параметры (комментарии), вы передаете object[]
вместо null
:
using System;
namespace MyNamespace {
public class Foo {
public void Bar(string value) {
Console.WriteLine("Foo.Bar called: " + value);
}
}
}
class Program {
static void Main() {
string className = "MyNamespace.Foo, MyAssemblyName",
methodName = "Bar";
Type type = Type.GetType(className);
object obj = Activator.CreateInstance(type);
object[] args = { "hello, world" };
type.GetMethod(methodName).Invoke(obj, args);
}
}
Если вы делаете это лот (для того же метода), есть способ повысить производительность с помощью типизированного делегата, но это не принесет вам много пользы для случайных вызовов .