Para invocar un constructor, Activator.CreateInstance hará el truco. Tiene un montón de sobrecargas para hacerte la vida más fácil.
Si su constructor es parameterless:
object instance = Activator.CreateInstance(type)
Si necesita parameters:
object instance = Activator.CreateInstance(type, param1, param2)
Invocar, un método, una vez que tenga el objeto Type puede llamar GetMethod
para obtener el method, y luego Invoke
(con o sin parámetros) para invocarlo. Si lo necesita, Invoke también le dará el valor de retorno de la función que está llamando (o nulo si es un método nulo),
Para obtener una muestra un poco más detallada (pegar en una aplicación de consola y listo):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
namespace Test
{
public static class Invoker
{
public static object CreateAndInvoke(string typeName, object[] constructorArgs, string methodName, object[] methodArgs)
{
Type type = Type.GetType(typeName);
object instance = Activator.CreateInstance(type, constructorArgs);
MethodInfo method = type.GetMethod(methodName);
return method.Invoke(instance, methodArgs);
}
}
class Program
{
static void Main(string[] args)
{
// Default constructor, void method
Invoker.CreateAndInvoke("Test.Tester", null, "TestMethod", null);
// Constructor that takes a parameter
Invoker.CreateAndInvoke("Test.Tester", new[] { "constructorParam" }, "TestMethodUsingValueFromConstructorAndArgs", new object[] { "moo", false });
// Constructor that takes a parameter, invokes a method with a return value
string result = (string)Invoker.CreateAndInvoke("Test.Tester", new object[] { "constructorValue" }, "GetContstructorValue", null);
Console.WriteLine("Expect [constructorValue], got:" + result);
Console.ReadKey(true);
}
}
public class Tester
{
public string _testField;
public Tester()
{
}
public Tester(string arg)
{
_testField = arg;
}
public void TestMethod()
{
Console.WriteLine("Called TestMethod");
}
public void TestMethodWithArg(string arg)
{
Console.WriteLine("Called TestMethodWithArg: " + arg);
}
public void TestMethodUsingValueFromConstructorAndArgs(string arg, bool arg2)
{
Console.WriteLine("Called TestMethodUsingValueFromConstructorAndArg " + arg + " " + arg2 + " " + _testField);
}
public string GetContstructorValue()
{
return _testField;
}
}
}
Tnx mucho. Entre estas respuestas, solo esto funcionó para mí ... –
¿Qué pasa si no hay espacio de nombres? ¿Cómo proporcionamos typeName – MonsterMMORPG