2

ac# フォーム アプリケーションを使用して、vb.net プロジェクトのすべてのクラスのすべてのメソッド名を取得しようとしています。

私はここまで来ました:

private void BindMethods()
{
    var assembly = typeof(VBProject.Class1).Assembly;
    var publicClasses = assembly.GetExportedTypes().Where(p => p.IsClass);

    foreach (var classItem in publicClasses)
    {
        BindMethodNames<classItem>();
    }
}

private void BindMethodNames<T>()
{
    MethodInfo[] methodInfos = typeof(T).GetMethods(BindingFlags.Public | BindingFlags.Static);

    Array.Sort(methodInfos,
        delegate(MethodInfo methodInfo1, MethodInfo methodInfo2)
        {
            return methodInfo1.Name.CompareTo(methodInfo2.Name)
        });

    foreach (var methodInfo in methodInfos)
    {
        this.comboMethods.Items.Add(methodInfo.Name);
    }
}

ここに問題があります (私が何か間違ったことをしているため)、BindMethodNames<>() の呼び出しで「classItem」のように型を使用することはできません。

アプローチ全体が間違っていると思います。いくつかの提案を得たいと思います。

4

3 に答える 3

2

'BindMethodNames'の呼び出しでは、インスタンスではなくジェネリックの型を使用する必要がありますが、リフレクションを使用せずにこれを行うコードを記述することはできません。

繰り返しになりますが、ここでジェネリックを使用しても意味がありません-これは機能しませんか?

private void BindMethods() 
{ 
    var assembly = typeof(VBProject.Class1).Assembly; 
    var publicClasses = assembly.GetExportedTypes().Where(p => p.IsClass); 

    foreach (var classItem in publicClasses) 
    { 
        BindMethodNames(classItem); 
    } 
} 

private void BindMethodNames(Type type) 
{ 
    MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Public | BindingFlags.Static); 

    Array.Sort(methodInfos, 
        delegate(MethodInfo methodInfo1, MethodInfo methodInfo2) 
        { 
            return methodInfo1.Name.CompareTo(methodInfo2.Name) 
        }); 

    foreach (var methodInfo in methodInfos) 
    { 
        this.comboMethods.Items.Add(methodInfo.Name); 
    } 
} 
于 2012-07-06T10:28:19.460 に答える
1

この状況のジェネリックは特に役に立ちません。Type選択したアセンブリから取得したインスタンスのリストを既に反復しているため、2番目のメソッドはターゲットタイプをパラメーターとして受け取る必要があります。

private void BindMethodNames(Type target)
{
    MethodInfo[] methodInfos = target.GetMethods(
        BindingFlags.Public | BindingFlags.Static);

    Array.Sort(methodInfos,
        delegate(MethodInfo methodInfo1, MethodInfo methodInfo2)
        {
            return methodInfo1.Name.CompareTo(methodInfo2.Name);
        });

    foreach (var methodInfo in methodInfos)
    {
        this.comboMethods.Items.Add(methodInfo.Name);
    }
}
于 2012-07-06T10:28:17.823 に答える
0

リフレクションでメソッドを呼び出す必要があります。

var method = typeof(Foo).GetMethod("BindMethodNames", BindingFlags.Instance |
                                                      BindingFlags.NonPublic);
var generic = method.MakeGenericMethod(classItem);
generic.Invoke(this);
于 2012-07-06T10:26:15.803 に答える