在Windows / DevX表单上查找所有DataSet

时间:2017-07-14 12:48:41

标签: c# winforms strongly-typed-dataset

我想询问是否可以以某种方式查找并列出表单上的所有DataSet。

我在Form控件中找不到它们,它们是通过Visual Studio表单设计器添加的,我正在构建的软件中有很多不同的DataSet,我想为它们的一般管理编写一个库,但是为此,我必须以某种方式将它们添加到列表中,我无法找到关于此主题的任何内容。

object

DataSets是强类型的,但我的目的只是对它们执行通用的DataSet操作,正如代码已经说明的那样。

提前谢谢你,

Gray / Gary H.

1 个答案:

答案 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”

希望这有帮助,亲切的问候。