我正在尝试通过c#表单应用程序获取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&lt;&gt;()的调用中使用类型“classItem”。
我猜整个方法都错了,我很想得到一些建议。
答案 0 :(得分: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);
}
}
答案 1 :(得分:1)
针对这种情况的泛型并不是特别有用。您已经在迭代从所选程序集中检索到的Type
个实例的列表,因此您的第二个方法只需要将目标类型作为参数接收。
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);
}
}
答案 2 :(得分:0)
您需要使用反射调用该方法:
var method = typeof(Foo).GetMethod("BindMethodNames", BindingFlags.Instance |
BindingFlags.NonPublic);
var generic = method.MakeGenericMethod(classItem);
generic.Invoke(this);