如果可能,我如何根据字符串检查一个类是否存在,如果该类确实存在,则获取该对象的新实例。
我这里有这个方法来检查对象是否有方法。
public static bool HasMethod(object objectToCheck, string methodName)
{
Type type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
然后在那之后如何检查方法所需的参数?
这一切都可能吗?
答案
获得课程:
public T GetInstance<T>(string namespace, string type)
{
return (T)Activator.CreateInstance(Type.GetType(namespace + "." + type));
}
获取方法:
public static bool HasMethod(object objectToCheck, string methodName)
{
Type type = objectToCheck.GetType();
return type.GetMethod(methodName) != null;
}
...
dynamic controller = GetInstance<dynamic>(controllerString);
if (HasMethod(controller, actionString))
{
controller.GetType().GetMethod(actionString);
}
获取参数
MethodInfo mi = type.GetMethod(methodName);
if (mi != null)
{
ParameterInfo[] parameters = mi.GetParameters();
// The parameters array will contain a list of all parameters
// that the method takes along with their type and name:
foreach (ParameterInfo parameter in parameters)
{
string parameterName = parameter.Name;
Type parameterType = parameter.ParameterType;
}
}
答案 0 :(得分:2)
您可以在使用GetMethod
方法检索的MethodInfo实例上使用GetParameters
方法。
例如:
MethodInfo mi = type.GetMethod(methodName);
if (mi != null)
{
ParameterInfo[] parameters = mi.GetParameters();
// The parameters array will contain a list of all parameters
// that the method takes along with their type and name:
foreach (ParameterInfo parameter in parameters)
{
string parameterName = parameter.Name;
Type parameterType = parameter.ParameterType;
}
}
答案 1 :(得分:1)
看来你已经弄明白了如何获得一个方法。使用MethodInfo.GetParameters获取参数也非常简单。
但是,我猜这里你想要在调用之前检查方法的签名。当方法具有以下签名时,您应该小心方法可能具有可选参数或通用参数:
// Accepts 'Test(12345);' and implicitly compiles as 'Test<int>(12345)'
public void Test<T>(T foo) { /* ... */ }
或
// Accepts signatures for 'Test(string)' and 'Test()' in your code
public void Test(string foo = "") { /* ... */ }
此外,当您调用方法时,.NET会处理隐式转换以及协方差和继承等问题。例如,如果使用byte参数调用Foo(int),.NET会在调用之前将字节转换为int。换句话说,大多数方法签名都接受很多参数类型。
调用方法可能也不像看起来那么容易。使用GetParameters()获取ParameterInfo对象并检查它们是否设置了“IsOptional”标志。 (见下文)
检查签名的最简单方法是使用MethodInfo.Invoke简单地调用它。如果GetParameters中的参数数量与参数相同 - >调用。否则,请检查IsOptional。如果是,请使用'DefaultValue'检查它是否具有默认值,否则使用类型的默认值(类类型为null,值类型为默认值ctor)。
困难的方法是手动执行重载决策。我已经写了很多关于如何在这里实现的内容:Get best matching overload from set of overloads