首页 文章

有没有办法检查C#反射中的模糊方法?

提问于
浏览
0

我正在编写一个工具,使我更容易在C#中编写控制台应用程序 . 为此,我试图动态地使用命令解析器(使用反射)尝试根据给定的命令查找另一个对象(扩展或属于CommandUI类)的方法名称 . 但是,如果我想重载该对象上的方法然后从命令解析器访问其中一个重载方法,它会在尝试通过反射找到它时抛出一个AmbiguousMethodException . 该工具无法知道编译时包含哪些方法 . 除了在try ... catch块中包含Type.GetMethod(字符串名称)并捕获AmbiguousMethodException之外,有没有办法检查反射中的方法歧义?

1 回答

  • 0

    我建议使用LINQ来选择方法而不是使用内置过滤器选项(名称,绑定标志,参数类型等) . 内置标志非常有限 . 例如,我可以看到一个类似于你所描述的库的库,如下所示:

    // user invoked "foo -format json -url www.google.com
    // your code does something like:
    var args = new[] { "format", "url" };
    var matchingMethods = typeof(SomeType).Assembly.GetTypes()
        .Where(t => typeof(ICommand).IsAssignableFrom(t))
        .SelectMany(t => t.GetMethods())
        .Where(m => StringComparer.OrdinalIgnoreCase.Equals(m.Name, "foo"))
        .Where(m => {
            var parameters = m.GetParameters();
            var isValid = parameters.All(p => p.IsOptional || args.Contains(p.Name))
                && args.All(a => parameters.Any(p.Name == a));
            return isValid;
        })
        .ToArray();
    

    使用LINQ,您可以灵活地将所有信息考虑在内并根据需要进行过滤 .

相关问题