c# 反射获取类型为集合的属性.

lilei_new 2013-01-23 01:45:09

Class A
{
[CusAttribute("xx","pp")]
public string listName{get;set;}
[CusAttribute("xx","pp2")]
public list<string> listField{get;set}
}


如何通过反射来获取哪个属性是可枚举的,即继承了IEnumble<string>接口
...全文
800 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
whowhen21 2013-01-24
  • 打赏
  • 举报
回复
10L
引用 12 楼 lilei_new 的回复:
是的.可能是我描述不清
lilei_new 2013-01-24
  • 打赏
  • 举报
回复
引用 1 楼 ViewStates 的回复:
根据当前对象type获取所有公共实例property集合,然后依次判断每个propertyInfo的propertyType是否可以从IEnumable<string>中分配实例
给个代码.谢谢!
lilei_new 2013-01-24
  • 打赏
  • 举报
回复
引用 11 楼 Lost_Painting 的回复:
楼主你本身描述就是有问题的. "获取哪个属性是可枚举的,即继承了IEnumble<string>接口" 可枚举的并不仅仅限于继承了IEnumble<string>接口,而是实现了 IEnumerable . 你是否只是要判断找出实现了 IEnumble<string>接口 的属性? 引用 8 楼 lilei_new 的回复:引用 6 楼 Lost_……
是的.可能是我描述不清
鸭梨山大帝 2013-01-23
  • 打赏
  • 举报
回复
楼主你本身描述就是有问题的. "获取哪个属性是可枚举的,即继承了IEnumble<string>接口" 可枚举的并不仅仅限于继承了IEnumble<string>接口,而是实现了 IEnumerable . 你是否只是要判断找出实现了 IEnumble<string>接口 的属性?
引用 8 楼 lilei_new 的回复:
引用 6 楼 Lost_Painting 的回复:这个是.NET 基础类库中 string 的源代码 C# code?12345[Serializable, ComVisible(true)]public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>,……
whowhen21 2013-01-23
  • 打赏
  • 举报
回复
引用 8 楼 lilei_new 的回复:
引用 6 楼 Lost_Painting 的回复:这个是.NET 基础类库中 string 的源代码 C# code?12345[Serializable, ComVisible(true)]public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>,……
string 也可以foreach,只不过遍历的是char。 以下方法肯定可以达到要求
typeof(A).GetProperties().Where(p => p.PropertyType.IsGenericType 
	&& p.PropertyType.GetInterface("IEnumerable", false) != null 
	&& typeof(string) == p.PropertyType.GetGenericArguments()[0])
	.ToList().ForEach(p => Console.WriteLine(p.Name));
lilei_new 2013-01-23
  • 打赏
  • 举报
回复
引用 2 楼 gxingmin 的回复:
C# code?123456789101112131415161718192021222324252627282930313233Test t = new Test(); Type type = t.GetType(); System.Reflection.PropertyInfo[] pis = type.GetPropert……
我说的是遍历,就是可以forea不是那个enum类型.
lilei_new 2013-01-23
  • 打赏
  • 举报
回复
引用 6 楼 Lost_Painting 的回复:
这个是.NET 基础类库中 string 的源代码 C# code?12345[Serializable, ComVisible(true)]public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnum……
String没有继承IEnumble<string>接口
lilei_new 2013-01-23
  • 打赏
  • 举报
回复
如何遍历检索出来的集合
鸭梨山大帝 2013-01-23
  • 打赏
  • 举报
回复
这个是.NET 基础类库中 string 的源代码


[Serializable, ComVisible(true)]
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<char>, IEnumerable, IEquatable<string>
{
... ...
} 

threenewbee 2013-01-23
  • 打赏
  • 举报
回复
GetInterfaces()方法。
whowhen21 2013-01-23
  • 打赏
  • 举报
回复
typeof(A).GetProperties().Where(p => p.PropertyType.GetInterface("IEnumerable", false) != null).ToList().ForEach(p => Console.WriteLine(p.Name));
事实上 string 也是可以forech的,所以也属于这个范围
  • 打赏
  • 举报
回复
var ary = typeof(A).GetProperties().Where(t => t.PropertyType.GetInterfaces().Count(tt => tt.Name == "IEnumerable")>0).ToArray();
gxingmin 2013-01-23
  • 打赏
  • 举报
回复
Test t = new Test();
            Type type = t.GetType();
            System.Reflection.PropertyInfo[] pis = type.GetProperties();
            foreach (System.Reflection.PropertyInfo pi in pis)
            {
                if(pi.PropertyType.IsEnum)
                    //枚举属性
                else
                   //不是枚举属性
            }


 public class Test
        {
            public string a
            {
                get;
                set;
            }

            public EnumNum b
            {
                get;
                set;
            }
        }

        public enum EnumNum
        {
            one,
            two

        }

ViewStates 2013-01-23
  • 打赏
  • 举报
回复
根据当前对象type获取所有公共实例property集合,然后依次判断每个propertyInfo的propertyType是否可以从IEnumable<string>中分配实例
C#源码大集合 03(共3卷)之前分为四个包,后两个包上传不了,对于已经下载的朋友表示赚意,现在重新再发一次(改为3卷)├─C#源码第一部分│ ├─第1章 控件操作│ │ ├─实例1 如何使用错误提醒控件│ │ ├─实例10 如何使用列表视图控件│ │ ├─实例11 如何使用多选列表框控件│ │ ├─实例12 如何使用图像控件│ │ ├─实例13 如何使用窗体分隔控件│ │ ├─实例2 如何使用信息提示控件│ │ ├─实例3 如何使用菜单控件│ │ ├─实例4 如何使用工具栏控件│ │ ├─实例5 如何使用状态栏控件│ │ ├─实例6 如何使用托盘控件│ │ ├─实例7 如何使用标签页控件│ │ ├─实例8 如何使用进度条控件│ │ └─实例9 如何使用树视图控件│ ├─第2章 文件管理│ │ ├─实例14 如何获取程序文件信息│ │ ├─实例15 如何获取指定文件的根信息│ │ ├─实例16 如何获取当前程序所在的文件夹│ │ ├─实例17 如何获取指定文件夹下的所有文件│ │ ├─实例18 如何获取指定文件夹下的所有文件夹│ │ ├─实例19 如何获取和设置文件属性│ │ ├─实例20 如何获取和设置文件夹属性│ │ ├─实例21 如何判断文件或文件夹是否存在│ │ ├─实例22 如何创建和删除多层文件夹│ │ ├─实例23 如何监视文件和文件夹系统变化情况│ │ ├─实例24 如何加解密文件│ │ ├─实例25 如何切分组合文件│ │ ├─实例26 如何以流式方式读写文本文件│ │ ├─实例27 如何直接打印文件│ │ ├─实例28 如何操作帮助文件│ │ ├─实例29 如何操作WORD文件│ │ ├─实例31 如何播放MP3文件│ │ ├─实例32 如何播放VCD文件│ │ ├─实例33 如何播放DVD文件│ │ ├─实例34 如何播放Flash文件│ │ └─实例35 如何播放RealPlayer文件│ ├─第3章 程序设置│ │ ├─实例36 如何创建椭圆形窗体│ │ ├─实例37 如何创建文字形窗体│ │ ├─实例38 如何创建不规则窗体│ │ ├─实例39 如何创建移动的窗体│ │ ├─实例40 如何创建无标题栏窗体│ │ ├─实例41 如何拖动无标题栏窗体│ │ ├─实例42 如何制作自绘式菜单│ │ ├─实例43 如何制作图形组合框│ │ ├─实例44 如何设置窗体的透明度│ │ ├─实例45 如何设置窗体启动位置│ │ ├─实例46 如何设置窗体最前端显示│ │ ├─实例47 如何实现精灵提示│ │ ├─实例48 如何实现打印预览│ │ ├─实例49 如何实现剪贴板循环│ │ ├─实例50 如何实现菜单历史列表│ │ ├─实例51 如何实现程序互斥运行│ │ ├─实例52 如何屏蔽鼠标消息│ │ ├─实例53 如何模拟键盘输入│ │ ├─实例54 如何使用消息提示框│ │ ├─实例55 如何使用系统API函数(INI)│ │ ├─实例56 如何获取和设置输入法│ │ ├─实例57 如何在程序中启动其他程序│ │ ├─实例58 如何在程序中关闭其他程序│ │ ├─实例59 如何在开机时自动启动程序│ │ ├─实例60 如何启动电话拨号程序│ │ ├─实例61 如何启动屏幕保护程序│ │ ├─实例62 如何启动系统控制面板程序│ │ ├─实例63 如何编写多线程程序│ │ ├─实例64 如何编写DLL服务端程序│ │ ├─实例65 如何编写DLL客户端程序│ │ ├─实例66 如何编写用户控件程序│ │ └─实例67 如何给程序打包│ ├─第4章 系统维护│ │ ├─实例68 如何获取系统基本信息│ │ ├─实例69 如何获取系统服务信息│ │ ├─实例70 如何获取系统进程信息│ │ ├─实例71 如何获取系统日期时间│ │ ├─实例72 如何获取系统所有驱动器│ │ ├─实例73 如何获取系统驱动器信息│ │ ├─实例74 如何获取系统计数器信息│ │
C#源码大集合 02(共3卷) 之前分为四个包,后两个包上传不了,对于已经下载的朋友表示赚意,现在重新再发一次(改为3卷) ├─C#源码第一部分 │ ├─第1章 控件操作 │ │ ├─实例1 如何使用错误提醒控件 │ │ ├─实例10 如何使用列表视图控件 │ │ ├─实例11 如何使用多选列表框控件 │ │ ├─实例12 如何使用图像控件 │ │ ├─实例13 如何使用窗体分隔控件 │ │ ├─实例2 如何使用信息提示控件 │ │ ├─实例3 如何使用菜单控件 │ │ ├─实例4 如何使用工具栏控件 │ │ ├─实例5 如何使用状态栏控件 │ │ ├─实例6 如何使用托盘控件 │ │ ├─实例7 如何使用标签页控件 │ │ ├─实例8 如何使用进度条控件 │ │ └─实例9 如何使用树视图控件 │ ├─第2章 文件管理 │ │ ├─实例14 如何获取程序文件信息 │ │ ├─实例15 如何获取指定文件的根信息 │ │ ├─实例16 如何获取当前程序所在的文件夹 │ │ ├─实例17 如何获取指定文件夹下的所有文件 │ │ ├─实例18 如何获取指定文件夹下的所有文件夹 │ │ ├─实例19 如何获取和设置文件属性 │ │ ├─实例20 如何获取和设置文件夹属性 │ │ ├─实例21 如何判断文件或文件夹是否存在 │ │ ├─实例22 如何创建和删除多层文件夹 │ │ ├─实例23 如何监视文件和文件夹系统变化情况 │ │ ├─实例24 如何加解密文件 │ │ ├─实例25 如何切分组合文件 │ │ ├─实例26 如何以流式方式读写文本文件 │ │ ├─实例27 如何直接打印文件 │ │ ├─实例28 如何操作帮助文件 │ │ ├─实例29 如何操作WORD文件 │ │ ├─实例31 如何播放MP3文件 │ │ ├─实例32 如何播放VCD文件 │ │ ├─实例33 如何播放DVD文件 │ │ ├─实例34 如何播放Flash文件 │ │ └─实例35 如何播放RealPlayer文件 │ ├─第3章 程序设置 │ │ ├─实例36 如何创建椭圆形窗体 │ │ ├─实例37 如何创建文字形窗体 │ │ ├─实例38 如何创建不规则窗体 │ │ ├─实例39 如何创建移动的窗体 │ │ ├─实例40 如何创建无标题栏窗体 │ │ ├─实例41 如何拖动无标题栏窗体 │ │ ├─实例42 如何制作自绘式菜单 │ │ ├─实例43 如何制作图形组合框 │ │ ├─实例44 如何设置窗体的透明度 │ │ ├─实例45 如何设置窗体启动位置 │ │ ├─实例46 如何设置窗体最前端显示 │ │ ├─实例47 如何实现精灵提示 │ │ ├─实例48 如何实现打印预览 │ │ ├─实例49 如何实现剪贴板循环 │ │ ├─实例50 如何实现菜单历史列表 │ │ ├─实例51 如何实现程序互斥运行 │ │ ├─实例52 如何屏蔽鼠标消息 │ │ ├─实例53 如何模拟键盘输入 │ │ ├─实例54 如何使用消息提示框 │ │ ├─实例55 如何使用系统API函数(INI) │ │ ├─实例56 如何获取和设置输入法 │ │ ├─实例57 如何在程序中启动其他程序 │ │ ├─实例58 如何在程序中关闭其他程序 │ │ ├─实例59 如何在开机时自动启动程序 │ │ ├─实例60 如何启动电话拨号程序 │ │ ├─实例61 如何启动屏幕保护程序 │ │ ├─实例62 如何启动系统控制面板程序 │ │ ├─实例63 如何编写多线程程序 │ │ ├─实例64 如何编写DLL服务端程序 │ │ ├─实例65 如何编写DLL客户端程序 │ │ ├─实例66 如何编写用户控件程序 │ │ └─实例67 如何给程序打包 │ ├─第4章 系统维护 │ │ ├─实例68 如何获取系统基本信息 │ │ ├─实例69 如何获取系统服务信息 │ │ ├─实例70 如何获取系统进程信息 │ │ ├─实例71 如何获取系统日期时间 │ │ ├─实例72 如何获取系统所有驱动器 │ │ ├─实例73 如何获取系统驱动器信息 │ │ ├─实例74 如何获取系统计数器信息 │ │ ├─实例75 如何获取操作系统版本信息 │ │ ├─实例76 如何获取系统特殊文件夹信息 │ │ ├─实例77 如何获取系统文化和国家信息 │ │ ├─实例78 如何获取系统已经安装的字体 │ │ ├─实例79 如何获取系统安装日期和启动时间 │ │ ├─实例80 如何获取CPU信息 │ │ ├─实例81 如何浏览注册表信息 │ │ ├─实例82 如何隐藏系统驱动器 │ │ ├─实例83 如何清理系统回收站 │ │ ├─实例84 如何制作日志查看器 │ │ ├─实例85 如何禁止关闭操作系统
C#源码大集合 01(共3卷)之前分为四个包,后两个包上传不了,对于已经下载的朋友表示赚意,现在重新再发一次(改为3卷)├─C#源码第一部分│ ├─第1章 控件操作│ │ ├─实例1 如何使用错误提醒控件│ │ ├─实例10 如何使用列表视图控件│ │ ├─实例11 如何使用多选列表框控件│ │ ├─实例12 如何使用图像控件│ │ ├─实例13 如何使用窗体分隔控件│ │ ├─实例2 如何使用信息提示控件│ │ ├─实例3 如何使用菜单控件│ │ ├─实例4 如何使用工具栏控件│ │ ├─实例5 如何使用状态栏控件│ │ ├─实例6 如何使用托盘控件│ │ ├─实例7 如何使用标签页控件│ │ ├─实例8 如何使用进度条控件│ │ └─实例9 如何使用树视图控件│ ├─第2章 文件管理│ │ ├─实例14 如何获取程序文件信息│ │ ├─实例15 如何获取指定文件的根信息│ │ ├─实例16 如何获取当前程序所在的文件夹│ │ ├─实例17 如何获取指定文件夹下的所有文件│ │ ├─实例18 如何获取指定文件夹下的所有文件夹│ │ ├─实例19 如何获取和设置文件属性│ │ ├─实例20 如何获取和设置文件夹属性│ │ ├─实例21 如何判断文件或文件夹是否存在│ │ ├─实例22 如何创建和删除多层文件夹│ │ ├─实例23 如何监视文件和文件夹系统变化情况│ │ ├─实例24 如何加解密文件│ │ ├─实例25 如何切分组合文件│ │ ├─实例26 如何以流式方式读写文本文件│ │ ├─实例27 如何直接打印文件│ │ ├─实例28 如何操作帮助文件│ │ ├─实例29 如何操作WORD文件│ │ ├─实例31 如何播放MP3文件│ │ ├─实例32 如何播放VCD文件│ │ ├─实例33 如何播放DVD文件│ │ ├─实例34 如何播放Flash文件│ │ └─实例35 如何播放RealPlayer文件│ ├─第3章 程序设置│ │ ├─实例36 如何创建椭圆形窗体│ │ ├─实例37 如何创建文字形窗体│ │ ├─实例38 如何创建不规则窗体│ │ ├─实例39 如何创建移动的窗体│ │ ├─实例40 如何创建无标题栏窗体│ │ ├─实例41 如何拖动无标题栏窗体│ │ ├─实例42 如何制作自绘式菜单│ │ ├─实例43 如何制作图形组合框│ │ ├─实例44 如何设置窗体的透明度│ │ ├─实例45 如何设置窗体启动位置│ │ ├─实例46 如何设置窗体最前端显示│ │ ├─实例47 如何实现精灵提示│ │ ├─实例48 如何实现打印预览│ │ ├─实例49 如何实现剪贴板循环│ │ ├─实例50 如何实现菜单历史列表│ │ ├─实例51 如何实现程序互斥运行│ │ ├─实例52 如何屏蔽鼠标消息│ │ ├─实例53 如何模拟键盘输入│ │ ├─实例54 如何使用消息提示框│ │ ├─实例55 如何使用系统API函数(INI)│ │ ├─实例56 如何获取和设置输入法│ │ ├─实例57 如何在程序中启动其他程序│ │ ├─实例58 如何在程序中关闭其他程序│ │ ├─实例59 如何在开机时自动启动程序│ │ ├─实例60 如何启动电话拨号程序│ │ ├─实例61 如何启动屏幕保护程序│ │ ├─实例62 如何启动系统控制面板程序│ │ ├─实例63 如何编写多线程程序│ │ ├─实例64 如何编写DLL服务端程序│ │ ├─实例65 如何编写DLL客户端程序│ │ ├─实例66 如何编写用户控件程序│ │ └─实例67 如何给程序打包│ ├─第4章 系统维护│ │ ├─实例68 如何获取系统基本信息│ │ ├─实例69 如何获取系统服务信息│ │ ├─实例70 如何获取系统进程信息│ │ ├─实例71 如何获取系统日期时间│ │ ├─实例72 如何获取系统所有驱动器│ │ ├─实例73 如何获取系统驱动器信息│ │ ├─实例74 如何获取系统计数器信息│ │

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧