How could I go about calling a method on a static class given the class name and the method name, please?
For example:
Given "System.Environment" and "GetFolderPath", I'd like to use reflection to call Environment.GetFolderPath()
.
Thanks,
Dan
How could I go about calling a method on a static class given the class name and the method name, please?
For example:
Given "System.Environment" and "GetFolderPath", I'd like to use reflection to call Environment.GetFolderPath()
.
Thanks,
Dan
Here is a basic outline of what you would do:
Edit: This will work if you do not know the namespace of the static class. Otherwise use Daniel Brückner's solution as its much simpler.
Just
Type.GetType(typeName).GetMethod(methodName).Invoke(null, arguments);
where typeName
is the name of the type as a string, methodName
is the name of the method as a string, and arguments
is an array of objects containing the arguments to call the method with.
System.Reflection.Assembly info = typeof(System.Environment).Assembly;
Type t = info.GetType("System.Environment"); MethodInfo m = t.GetMethod("GetFolderPath");
object result = m.Invoke(null, arguments);
First you need to get the Type (by iterating on the assembly using reflection)
see this link for details: http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx
or use
Assembly.GetType
once you have the type in hand you can iterate over members using reflection or
MethodInfo method = typeof(MyClass).GetMethod("MyMethod");
then you can use MethodInfo.Invoke
and pass arguments to invoke the method when you want to invoke it.
What you are doing here is reflecting on the type named Environement and using the GetPropery and GetGetMethod methods to get the get method of the Environment.CurrentDirectory property like so
var getMethod = typeof(Environment).GetProperty("CurentDirectory", BindingFlags.Public | BindingFlags.Static).GetGetMethod();
var currentDirectory = (string)getMethod.Invoke(null, null);
Calling the get method of a property returns it's value and is equivilent to
var value = Environment.CurrentDirectory;