ОПИСАНИЕ : Я хочу взять все доступные элементы управления из более чем 1000 winforms из многих сборок. Я не хочу иметь большие усилия по рефакторингу. (Небольшой инструмент, причина для внутреннего использования)
ЧТО УЖЕ СДЕЛАНО : Получил все сборки, и из каждой сборки взял все типы, которые мне интересны, через type.IsSubclassOf(selectedType)
.
ИНФОРМАЦИЯ ОБ ОСНОВНОМ ПРОЕКТЕ : Многие классы имеют конструкторы по умолчанию, некоторые нет, другие ссылаются на другие базовые классы. Структура проекта не столь оптимальна, потому что это продукт, который разрабатывался в течение 15 лет.
ПРОБЛЕМА : Я пытался взять все элементы управления с помощью отражения, используя Activator.CreateInstance(type)
, но для многих классов Я взял необработанные исключения или другие исключения базового класса, которые не были управляемы. Другой проблемой, с которой я столкнулся во время этой процедуры, был кастинг. Я также пытался FormatterServices.GetUninitializedObject(type)
, но я не нашел, как или можно ли взять элементы управления.
ВОПРОС : можно ли собрать элементы управления winForm 'Form' с такой структурой без особых усилий? Какие могут быть различные способы добиться этого?
ПРИМЕР КОДА
static List<AssemblyName> _assemblyList=new List<AssemblyName>();
static List<Type> _typeList = new List<Type>();
static List<Control> _controlList = new List<Control>();
private static void getFormTypes()
{
foreach (AssemblyName assemblyName in _assemblyList)
{
Assembly assembly = Assembly.Load(assemblyName);
foreach (Type type in assembly.GetTypes())
{
if (type.IsSubclassOf(typeof(Form)))
{
_typeList.Add(type);
}
}
}
}
private static void getAllControlsFromFormTypes()
{
foreach (Type type in _typeList)
{
object instance = default;
if (HasValidConstructor(type))
{
instance = Activator.CreateInstance(type);//Here I have unhandled exceptions from base classes during constructor invoking
GetValidControls((Control)instance);
}
}
}
private static void GetValidControls(Control container)
{
foreach (Control control in container.Controls)
{
GetValidControls(control);
if (!string.IsNullOrEmpty(control.Name) && !string.IsNullOrEmpty(control.Text))
{
_controlList.Add(control);
}
}
}
public static bool HasValidConstructor(Type t) => t.IsValueType || !t.IsAbstract && t.GetConstructor(Type.EmptyTypes) != null;```