visual valid name example documentacion comment comentarios c# .net reflection attributes custom-attributes

valid - summary documentation c#



Obteniendo el tipo de MemberInfo con reflexión (2)

Estoy utilizando la reflexión para cargar una vista de árbol con la estructura de clase de un proyecto. Cada uno de los miembros de una clase tiene un atributo personalizado asignado.

No tengo problemas para obtener los atributos de una clase usando MemberInfo.GetCustomAttributes() sin embargo, necesito una forma de averiguar si un miembro de la clase es una clase personalizada y luego necesita analizarla para devolver los atributos personalizados.

Hasta ahora, mi código es:

MemberInfo[] membersInfo = typeof(Project).GetProperties(); foreach (MemberInfo memberInfo in membersInfo) { foreach (object attribute in memberInfo.GetCustomAttributes(true)) { // Get the custom attribute of the class and store on the treeview if (attribute is ReportAttribute) { if (((ReportAttribute)attribute).FriendlyName.Length > 0) { treeItem.Items.Add(new TreeViewItem() { Header = ((ReportAttribute)attribute).FriendlyName }); } } // PROBLEM HERE : I need to work out if the object is a specific type // and then use reflection to get the structure and attributes. } }

¿Existe una manera fácil de obtener el tipo de destino de una instancia de MemberInfo para que pueda manejarlo de manera adecuada? Siento que me estoy perdiendo algo obvio, pero estoy dando vueltas en círculos en el momento.


Creo que puede obtener un mejor rendimiento si utiliza este método de extensión:

public static Type GetUnderlyingType(this MemberInfo member) { switch (member.MemberType) { case MemberTypes.Event: return ((EventInfo)member).EventHandlerType; case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Method: return ((MethodInfo)member).ReturnType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; default: throw new ArgumentException ( "Input MemberInfo must be if type EventInfo, FieldInfo, MethodInfo, or PropertyInfo" ); } }

Debería funcionar para cualquier MemberInfo , no solo para PropertyInfo . Puede evitar MethodInfo de esa lista, ya que no está bajo el tipo de mentira per se (pero devuelve el tipo).

En tu caso:

foreach (MemberInfo memberInfo in membersInfo) { foreach (object attribute in memberInfo.GetCustomAttributes(true)) { if (attribute is ReportAttribute) { if (((ReportAttribute)attribute).FriendlyName.Length > 0) { treeItem.Items.Add(new TreeViewItem() { Header = ((ReportAttribute)attribute).FriendlyName }); } } //if memberInfo.GetUnderlyingType() == specificType ? proceed... } }

Me pregunto por qué esto no ha sido parte de BCL por defecto.


GetProperties devuelve una matriz de PropertyInfo por lo que debe usar eso.
Entonces es simplemente una cuestión de usar la propiedad PropertyType .

PropertyInfo[] propertyInfos = typeof(Project).GetProperties(); foreach (PropertyInfo propertyInfo in propertyInfos) { // ... if(propertyInfo.PropertyType == typeof(MyCustomClass)) // ... }