クラスのメソッドのオーバーロードを作成するために、 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
が常に null であることです。つまりType.GetMethod
、呼び出しようとしているメソッドが見つからないということです。
更新:GetMethod
メソッドにType[]
配列を指定しないと、呼び出しがあいまいであることを示す例外がスローされることに注意してください。
UPDATE 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;
}