首页>Program>source

我正在使用反射来加载具有项目类结构的树形视图.类中的每个成员都分配有一个自定义属性.

使用 MemberInfo.GetCustomAttributes()获取类的属性没有问题 但是,我需要一种方法来确定类成员是否为自定义类,然后需要对其自身进行解析以返回自定义属性。

到目前为止,我的代码是:

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

是否有一种简单的方法来获取MemberInfo实例的目标类型,以便我可以适当地处理它? 我觉得我缺少明显的东西,但此刻我却转了一圈。

最新回答
  • 2天前
    1 #

    GetProperties 返回 PropertyInfo的数组 所以您应该使用它。
    然后,只需使用 PropertyType 属性。

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

  • 2天前
    2 #

    我认为,如果采用这种扩展方法,您将获得更好的性能:

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

    应适用于任何 MemberInfo ,而不仅仅是 PropertyInfo .您可以避免 MethodInfo 从该列表中删除,因为它本身不是隐藏类型(而是返回类型)。

    在您的情况下:

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

    我想知道为什么默认情况下它不属于BCL。

  • c#:XamarinForms不可应用的ListView(删除选择波纹效果)
  • C和C ++中的嵌套结构