Obtener elementos de ListView desde la clase Designer en WinForms utilizando Reflection en C#.
No estoy seguro si estoy en el camino correcto para probar este concepto. Aquí está la situación que estoy tratando de resolver.
Tengo un proyecto WinForms (VB.Net) y hay un formulario llamado frmMain.vb
. Tiene una clase de diseño llamada frmMain.Designer.vb
. He colocado un control ListView
en ese formulario y he establecido una colección de elementos estáticos en su propiedad Items
.
Estoy llamando a esta biblioteca de formularios WinForm en una aplicación de consola C# utilizando Reflection
. Quiero obtener la lista de elementos de ese ListView
en particular.
Assembly AssemblyObject = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "/WinForms.exe");
if (AssemblyObject != null)
{
Type ExceptedType = AssemblyObject.GetTypes().ToList().Where(a => a.Name == "frmMain").FirstOrDefault();
if (ExceptedType != null)
{
MemberInfo members = ((TypeInfo)ExceptedType).DeclaredMembers.Where(x => x.Name == "ListView").FirstOrDefault();
}
}
davy.ai
Según el fragmento de código proporcionado, parece que el enfoque utilizado para obtener la lista de elementos del control
ListView
no es correcto.En primer lugar, la propiedad
DeclaredMembers
de la claseTypeInfo
devuelve todos los miembros declarados o heredados por el tipo especificado. Esto incluye campos, métodos, constructores, propiedades y eventos. Por lo tanto, es posible que no sea la propiedad deseada para obtener el controlListView
.En su lugar, puedes utilizar el método
GetField
de la claseType
para obtener el objetoFieldInfo
que representa el controlListView
del formulariofrmMain
. Luego, puedes utilizar reflexión para obtener el valor de la propiedadItems
.Aquí tienes un fragmento de código actualizado que demuestra este enfoque:
Ten en cuenta que en el código anterior, asumí que la propiedad
Name
del controlListView
en el formulariofrmMain
eslistView1
. Debes reemplazarlo con el nombre real si es diferente en tu código.