根据字符串获取类,方法和参数

时间:2013-02-09 14:20:43

标签: c#

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

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

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

2 个答案:

答案 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