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