Reputation: 2814
is it possible to make generic function in c# that get as input some class and method (of the class) and parameters to the method ( and maybe the result type ) and make instance of that class and call to the function of the class with the parameters and return the result?
Upvotes: 0
Views: 1397
Reputation: 12993
Here's how you create an instance of a class using reflection and then call a method on that class.
Assuming you have a class:
public class MyType
{
public void DoSomething()
{
// do stuff here
}
}
You could do the following:
Type instanceType = Type.GetType("MyType");
object instance = Activator.CreateInstance(instanceType);
MethodInfo method = instanceType.GetMethod("MethodName");
object returnValue = method.Invoke(instance, new object[] { /* paramaters go here */ });
Upvotes: 1
Reputation: 49013
Sure.
public class MyClass
{
public class Test
{
public int TestMethod(int a, int b)
{
return a + b;
}
}
public static void Main()
{
int result = ExecuteMethod<Test, int>("TestMethod", 1, 2);
Console.Read();
}
public static TResult ExecuteMethod<TClass, TResult>(string methodName, params object[] parameters)
{
// Instantiate the class (requires a default parameterless constructor for the TClass type)
var instance = Activator.CreateInstance<TClass>();
// Gets method to execute
var method = typeof(TClass).GetMethod(methodName, BindingFlags.Public | BindingFlags.Instance);
// Executes and returns result
return (TResult)method.Invoke(instance, parameters);
}
}
Upvotes: 4
Reputation: 1195
Unless Reflection is your absolute option, use one of the following delegates:
Action<T>
: Will let you execute a method that does not return a value. There are several overloads that will let you pass in additional arguments.
Func<TResult>
: Will let you execute a method that returns a result of type TResult
. There are more overloads that will let you pass in additional arguments. They all follow the syntax Func<T1, T2, T3, TResult>
and so on.
And finally, you can define your own delegate.
Upvotes: 2
Reputation: 1408
Yes it's possible. You can do that with reflection.
Here you have a few useful links
Create an instance with reflection
How to invoke method with parameters
Upvotes: 1