我想询问是否可以以某种方式查找并列出表单上的所有DataSet。
我在Form控件中找不到它们,它们是通过Visual Studio表单设计器添加的,我正在构建的软件中有很多不同的DataSet,我想为它们的一般管理编写一个库,但是为此,我必须以某种方式将它们添加到列表中,我无法找到关于此主题的任何内容。
object
DataSets是强类型的,但我的目的只是对它们执行通用的DataSet操作,正如代码已经说明的那样。
提前谢谢你,
Gray / Gary H.
答案 0 :(得分:1)
好吧,经过一番思考后,我意识到数据集的实例不是控件集合的一部分,它们只是表单类的成员。 因此,我们的想法是加载包含的程序集,获取所有Form的子类,然后查找所有数据集类型的成员或从中继承的成员。以下代码应使用反射
using System;
using System.Linq;
using System.Reflection;
using System.Windows.Forms;
namespace TypeFinder
{
class Program
{
static void Main(string[] args)
{
// args[0]: Assembly path, args[1] Assembly containing type to find, args[2] Type to find
Type typeToFind = LoadTypeFrom(args[1], args[2]);
var forms = Assembly.LoadFrom(args[0]).GetTypes().Where(t => t.IsSubclassOf(typeof(Form)));
foreach (Type form in forms)
{
var fields = form.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
foreach (FieldInfo fieldInfo in fields)
{
if (IsSubclassOrSameTypeAs(typeToFind, fieldInfo.FieldType))
{
Console.Out.WriteLine($"Found type {fieldInfo.FieldType} as IsSubclassOrSameTypeAs of {typeToFind}");
}
}
}
Console.Out.WriteLine("Press any key to exit...");
Console.ReadLine();
}
private static bool IsSubclassOrSameTypeAs(Type baseType, Type descendant)
{
return descendant.IsSubclassOf(baseType) || descendant == baseType;
}
private static Type LoadTypeFrom(string path, string type)
{
if (string.IsNullOrEmpty(path))
{
return Type.GetType(type, true, true);
}
var assembly = Assembly.LoadFrom(path);
return assembly.GetType(type, true, true);
}
}
}
您可以使用程序集路径或完全限定的类型名称来调用此程序:
“C:\ MyCustomAssembly.dll”“C:\ MyCustomAssemblyWithTypeToFind.dll”“MyNamespace.MyCustomType”
“C:\ MyCustomAssembly.dll”“”“System.Data.DataSet,System.Data,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089”
希望这有帮助,亲切的问候。