【问题标题】:Invoke an overloaded generic method on a static class在静态类上调用重载的泛型方法
【发布时间】:2012-05-17 11:37:00
【问题描述】:

我正在尝试调用 InputExtensions 静态类上的方法,以便为 HtmlHelper 类上的方法创建重载。

所以无论如何,我仍然无法调用InputExtensions 类的方法。这是我用来执行此操作的部分代码:

    Type inputExtensions = typeof(InputExtensions);
    MethodInfo methodInfo = null;
    MethodInfo genericMethod = null;
    switch (propertyViewingMode.ViewingLevel)
    {
        case 1:
            methodInfo = inputExtensions.GetMethod(methodName, new Type[] { typeof(HtmlHelper<TModel>), typeof(Expression<Func<TModel, TProperty>>), typeof(Object) });
            genericMethod = methodInfo.MakeGenericMethod(typeof(TModel), typeof(TProperty));
            result = genericMethod.Invoke(null, new object[] { helper, expression, new { @class = "readOnly", @readonly = "read-only" } }) as MvcHtmlString;
            break;
        case 2:
            methodInfo = inputExtensions.GetMethod(methodName, new Type[] { typeof(HtmlHelper<TModel>), typeof(Expression<Func<TModel, TProperty>>) });
            genericMethod = methodInfo.MakeGenericMethod(typeof(TModel), typeof(TProperty));
            result = genericMethod.Invoke(null, new object[] { helper, expression }) as MvcHtmlString;
            break;
        default:
            result = new MvcHtmlString(String.Empty);
            break;
    }

问题在于methodInfo 始终为空,这意味着Type.GetMethod 找不到我要调用的方法。

更新:请注意,当我没有为 GetMethod 方法提供 Type[] 数组时,它会引发异常,告诉我调用不明确。

更新 2:这是我尝试调用的方法:

TextBoxFor<TModel, TProperty>(HtmlHelper<TModel>, Expression<Func<TModel, TProperty>>, Object)

回答:

    Type inputExtensions = typeof(InputExtensions);
    IEnumerable<MethodInfo> methods = null;
    MethodInfo genericMethod = null;
    MethodInfo methodInfo = null;
    switch (propertyViewingMode.ViewingLevel)
    {
        case 1:
            methods = inputExtensions.GetMethods().Where(m => m.IsGenericMethod && m.Name.Equals(methodName))
                                                        .Where(x => x.GetParameters().Count() == 3);
            methodInfo = methods.FirstOrDefault(x => x.GetParameters()[2].ParameterType.FullName == "System.Object");
            if (methodInfo != null)
            {
                genericMethod = methodInfo.MakeGenericMethod(new[] { typeof(TModel), typeof(TProperty) });
                result = genericMethod.Invoke(null, new object[] { helper, expression, new { @class = "readOnly", @readonly = "read-only" } }) as MvcHtmlString;
            }
            break;
        case 2:
            methods = inputExtensions.GetMethods().Where(m => m.IsGenericMethod && m.Name.Equals(methodName))
                                                        .Where(x => x.GetParameters().Count() == 2);
            methodInfo = methods.FirstOrDefault();
            if (methodInfo != null)
            {
                genericMethod = methodInfo.MakeGenericMethod(new[] { typeof(TModel), typeof(TProperty) });
                result = genericMethod.Invoke(null, new object[] { helper, expression }) as MvcHtmlString;
            }
            break;
        default:
            result = new MvcHtmlString(String.Empty);
            break;
    }

【问题讨论】:

  • 您尝试使用 GetMethod 查找哪种方法?是公开的还是私有的?你应该提供正确的 BindingFlags 来找到你想要的。默认情况下它只搜索公共方法
  • 反正我只对公共方法感兴趣。
  • 发布您要查找的方法的签名。这会让它变得容易得多。您遇到的问题是您当前正在搜索公共实例方法,但您说您正在搜索静态类上的方法
  • @Rune FS:我更新了问题。请检查更新 2。

标签: c# .net asp.net-mvc-3 reflection html-helper


【解决方案1】:

不幸的是,似乎不可能……http://blogs.msdn.com/b/yirutang/archive/2005/09/14/466280.aspx

您唯一能做的就是迭代所有具有给定名称的方法并自己分析参数类型:(

【讨论】:

  • 这是一种预感 :( 很高兴知道这是不可能的。
  • 很奇怪,还没修好
  • 你可能是对的。我最终使用 LINQ 来找到我需要的重载。
  • 真的不可能修复:(
  • 能否请您澄清一下,为什么?
【解决方案2】:

我相信你想要:

BindingFlags.Public | BindingFlags.Static

编辑:

尝试在调试模式下迭代方法,直到找到所需的方法,然后您可以检查参数以确保它们都对齐。

typeof(A).GetMethods().Where(m => m.IsGenericMethod); 

【讨论】:

  • 不,没有帮助。而且,这个类的所有方法都是公共的和静态的。
  • 我认为您将不得不发布您的模型。
猜你喜欢
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
  • 2015-03-09
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 1970-01-01
  • 2017-03-03
相关资源
最近更新 更多