0

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?

ilay zeidman
  • 2,654
  • 5
  • 23
  • 45

4 Answers4

4

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);
    }
}
ken2k
  • 48,145
  • 10
  • 116
  • 176
2

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.

Mario J Vargas
  • 1,185
  • 6
  • 12
1

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

Community
  • 1
  • 1
vfabre
  • 1,388
  • 12
  • 23
1

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 */ });
Ian P
  • 12,840
  • 6
  • 48
  • 70