2

クラスのメソッドのオーバーロードを作成するために、 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;
    }
4

2 に答える 2

3

残念ながら、それは不可能のようです... http://blogs.msdn.com/b/yirutang/archive/2005/09/14/466280.aspx

あなたができる唯一のことは、与えられた名前を持つすべてのメソッドを繰り返し処理し、引数の型を自分で分析することです:(

于 2012-05-17T12:15:33.970 に答える
2

私はあなたが望むと信じています:

BindingFlags.Public | BindingFlags.Static

編集:

探しているメソッドが見つかるまでデバッグモードでメソッドを繰り返してみてください。その後、パラメーターを調べて、すべてが揃っていることを確認できます。

typeof(A).GetMethods().Where(m => m.IsGenericMethod); 
于 2012-05-17T11:48:47.070 に答える