1

如果可能的话,我如何根据字符串检查一个类是否存在,如果该类确实存在,则获取该对象的新实例。

我这里有这个方法来检查一个对象是否有方法。

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;
    }
}
4

2 回答 2

2

您可以在使用该GetParameters方法检索到的 MethodInfo 实例上使用该GetMethod方法。

例如:

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;
    }
}
于 2013-02-09T14:25:48.220 回答
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)。

困难的方法是手动进行重载解析。我已经写了很多关于如何在这里实现它的文章:从重载集中获取最佳匹配重载

于 2013-02-09T14:38:27.587 回答