Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在静态类上调用重载泛型方法_C#_.net_Asp.net Mvc 3_Reflection_Html Helper - Fatal编程技术网

C# 在静态类上调用重载泛型方法

C# 在静态类上调用重载泛型方法,c#,.net,asp.net-mvc-3,reflection,html-helper,C#,.net,Asp.net Mvc 3,Reflection,Html Helper,我试图调用静态类上的方法,以便为HtmlHelper类上的方法创建重载 所以无论如何,我仍然无法调用InputExtensions类的方法。下面是我用来执行此操作的部分代码: Type inputExtensions = typeof(InputExtensions); MethodInfo methodInfo = null; MethodInfo genericMethod = null; switch (propertyViewingMode.Viewing

我试图调用静态类上的方法,以便为
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;
    }
回答:

    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;
    }
Type inputExtensions=typeof(inputExtensions);
IEnumerable方法=null;
MethodInfo genericMethod=null;
MethodInfo MethodInfo=null;
开关(propertyViewingMode.ViewingLevel)
{
案例1:
methods=inputExtensions.GetMethods()。其中(m=>m.IsGenericMethod&&m.Name.Equals(methodName))
其中(x=>x.GetParameters().Count()==3);
methodInfo=methods.FirstOrDefault(x=>x.GetParameters()[2]。ParameterType.FullName==“System.Object”);
如果(methodInfo!=null)
{
genericMethod=methodInfo.MakeGenericMethod(新[]{typeof(TModel),typeof(TProperty)});
result=genericMethod.Invoke(null,新对象[]{helper,表达式,新{@class=“readOnly”,@readOnly=“read-only”})作为MvcHtmlString;
}
打破
案例2:
methods=inputExtensions.GetMethods()。其中(m=>m.IsGenericMethod&&m.Name.Equals(methodName))
其中(x=>x.GetParameters().Count()==2);
methodInfo=methods.FirstOrDefault();
如果(methodInfo!=null)
{
genericMethod=methodInfo.MakeGenericMethod(新[]{typeof(TModel),typeof(TProperty)});
result=genericMethod.Invoke(null,新对象[]{helper,expression})作为MvcHtmlString;
}
打破
违约:
结果=新的MvcHtmlString(String.Empty);
打破
}
我相信您想要:

BindingFlags.Public | BindingFlags.Static
编辑:

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

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

不幸的是,这似乎是不可能的


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

您试图使用GetMethod查找哪个方法?它是公共的还是私有的?您应该提供正确的BindingFlags来查找所需的内容。默认情况下,它只搜索公共方法。我只对公共方法感兴趣。发布该方法的签名)您正在尝试查找。这将使查找更容易。您遇到的问题是,您当前正在搜索公共实例方法,但您说您正在搜索静态实例上的方法class@RuneFS:我更新了问题。请检查更新2。不,没有帮助。而且,这个类上的所有方法都是公共的和静态的。我想你将不得不发布你的模型。这是一个预感:(很高兴知道这是不可能的。很奇怪,它没有被修复是的,你可能是对的。我最终使用LINQ来找到我需要的过载。它实际上不可能修复:(你能澄清一下,为什么?
typeof(A).GetMethods().Where(m => m.IsGenericMethod);