2017-07-14 32 views
0

我想問一下,是否有可能以某種方式查找並列出表單上的所有數據集。查找Windows/DevX表單上的所有數據集

我在窗體控件中找不到它們,它們已經通過Visual Studio窗體設計器添加了,並且在構建的軟件中會有這麼多不同的DataSet,我想爲它們的一般管理編寫一個庫,但爲此,我必須以某種方式將它們添加到列表中,並且我無法找到關於此主題的任何內容。

List<DataSet> formSets = new List<DataSet>(); 
    //Operation to find all DataSets on the Form <--- This is what I'm looking for, 
    //probably a cycle which results in DataSet typed foundDataSet each time it executes. 
formSets.Add(foundDataSet) 
    //Number of other initializing operations like setting defaults and so on. 

數據集是強類型的,但我只旨在對它們執行通用DataSet的操作,因爲代碼已經指出。

謝謝你在前進,

灰色/加利·H

+0

如果您查看生成的exe或dll,則無論數據集是在設計的還是在部分表單的類中都無關緊要。只需找到第一個表單,然後遞歸迭代Controls屬性,查看控件是否繼承自Dataset – Oscar

+0

您能否提供一個示例?我似乎無法通過代碼的表單控件列表訪問數據集。 – GrayBK

回答

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,版本= 4.0.0.0,文化=中性公鑰= b77a5c561934e089「

希望這有助於,善良的問候。

相關問題