嘛,想着一點點我認識到,數據集的情況下,不控制集合一部分後,他們只是形式類的成員。 所以,這個想法是加載包含的程序集,獲取所有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「
希望這有助於,善良的問候。
如果您查看生成的exe或dll,則無論數據集是在設計的還是在部分表單的類中都無關緊要。只需找到第一個表單,然後遞歸迭代Controls屬性,查看控件是否繼承自Dataset – Oscar
您能否提供一個示例?我似乎無法通過代碼的表單控件列表訪問數據集。 – GrayBK