Getting the type of a MemberInfo with reflection

后端 未结 2 1436
逝去的感伤
逝去的感伤 2020-12-14 16:39

I\'m using reflection to load a treeview with the class structure of a project. Each of the members in a class have a custom attribute assigned to them.

I don\'t ha

相关标签:
2条回答
  • 2020-12-14 17:10

    I think you can get better performance if you carry around this extension method:

    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"
                );
        }
    }
    

    Should work for any MemberInfo, not just PropertyInfo. You may avoid MethodInfo from that list since its not under lying type per se (but return type).

    In your case:

    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...
        }
    }
    

    I wonder why this hasn't been part of BCL by default.

    0 讨论(0)
  • 2020-12-14 17:23

    GetProperties returns an array of PropertyInfo so you should use that.
    Then it is simply a matter of using the PropertyType property.

    PropertyInfo[] propertyInfos = typeof(Project).GetProperties();
    
    foreach (PropertyInfo propertyInfo in propertyInfos)
    {
        // ...
        if(propertyInfo.PropertyType == typeof(MyCustomClass))
            // ...
    }
    
    0 讨论(0)
提交回复
热议问题