反射实体类的属性

时间:2020-12-23 19:22:31
class Users{

      private string _aa;

        public string Aa
        {
            get { return _aa; }
            set { _aa = value; }
        }

        private string _bb;

        public string Bb
        {
            get { return _bb; }
            set { _bb = value; }
        }

        private List<CC> _cc;

        public List<CC> Cc
        {
            get { return _cc; }
            set { _cc = value; }
        }

        private ListItemCollection dd;

        public ListItemCollection Dd
        {
            get { return dd; }
            set { dd = value; }
        }
}


---------------------------------------------
假如这是个实体类
我现在反射它的  所有属性
  Users users = new Users();
  users.GetType().GetProperties();
返回的是一个PropertyInfo[] info;  属性的集合



问题出来了,  假如我想写一个方法, 
我想只反射当前Users类的  个别属性, 比如, 我想拼接个字符串 
是根据当前Users的aa  bb属性, 而且其他的属性我又不想获得, 

麻烦在这里  .GetType().GetProperties() 这个方法的时候, 全部反射出来了, 我只想用个别的属性
但是又不想用字符穿去控制   不知道各位有没有什么好办法

30 个解决方案

#1


.GetType().GetProperty("aa")

#2


把个别的属性放在基类中,你再集成,然后反射基类

#3


danjiewu
 
(阿丹)  .GetType().GetProperty("aa")

--------------------------------------------
我知道有这个方法啊, 但是这样做的话, 有点太不灵活了, 
我想找到一个可以能控制  实体类属性的方法,  

不知道大家有没有什么好的思路给提供一下啊

#4


 jsyhello
 
(不认输)     把个别的属性放在基类中,你再集成,然后反射基类
------------------------------------------------------------
我懂你的意思啊,  但是你想想,如果这样做的话岂不是很麻烦,  简单的实体类反射字段,
难道还要一个 抽象类, 我原来试过用  params 这个 ,动态参数 ,可是, 还是不行啊, 太麻烦了, 
7,8个的还行, 要是一个表里,  40,50的那种, 岂不是要累死, 不好啊, 愁死

 各位朋友, 多多提供思路啊

#5


给你返回个数组,而你只想用数组其中两个数据,这能有什么问题?

#6


从你的Info数组中查找其.Name叫做aa和bb的两个单元,这会产生什么问题?

你是不会foreach循环查找数组呢?还是不会new一个新的List<PropertyInfo>将这两个单元放入集合?

#7


引用 6 楼 sp1234 的回复:
从你的Info数组中查找其.Name叫做aa和bb的两个单元,这会产生什么问题?

你是不会foreach循环查找数组呢?还是不会new一个新的List<PropertyInfo>将这两个单元放入集合?




那要照你这么说的话, 是我问的太低端了, 还是您老人家的技术太高超了, 
那么我的问你了,   你说的 foreach 循环 OK
  如果 有20个属性, 给你循环的话 怎么办,  假如, 我的属性名字变了, 怎么办 , 这次我用的AA  BB
下个类型我用的是别的名字, 难道照你说我, 我要根据不同的属性, 写不同的方法, 

那跟手写mvc有什么区别,   我也就不会在这里提问了, 哥们。你懂得, 

#8


那就通过反射实例化类,在显示转换为对应的类,就可以点出那些属性!

#9


引用 8 楼 huangwenquan123 的回复:
那就通过反射实例化类,在显示转换为对应的类,就可以点出那些属性!


不是, 你理解错了啊 8楼的朋友,    
这么说吧, 我现在是可以找到当前的这个类型, 也可以获取相应的属性,  
但是我现在想要的效果就是 ,能控制他的属性, 
比如, 现在是这个类型, 我就想要  aa  bb的属性, 其他的属性, 在调用GetProperties();

方法的时候,去掉其他没用的属性,  我要的是这样的效果    
   呵呵, 
不过还是谢谢你能帮顶 ,  3Q

#10


属性名变?什么意思?属性名还能变啊?

#11


引用 10 楼 gengchenhui 的回复:
属性名变?什么意思?属性名还能变啊?

我的意思是, 要万一换个实体类,属性名不就是变了吗?
要灵活多变!!!!

#12


楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value;   //这种需要自己实现索引器
或者:
User.Properties.Fist(p=>p.Key=="Name").Value;   //利用现成的L2O

#13


引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value; //这种需要自己实现索引器
或者:
User.Properties.Fis……



感谢飞翔的心,  

可以你说的这个是在给实体类里面传值,  我想要的是这样, 

Users users = new Users();
users.aa="测试";
users.bb="测试";

PropertyInfo[] info = users.GetProperties();
现在我这里面是不是 除aa bb以外是不是还有其他的属性啊, 

StringBuilder sb = new StringBuilder();

    for (int i = 0; i < info.Length; i++)
    {
        sb.Append(i == 0 ? "" : ",");

        sb.Append(info[i].Name);
     }
那么我在这里的时候, 我想把其他不要的属性, 排除掉不让他获取, 
在假设, 我的Users  是Object   基类, 
我现在不知道我要排除什么属性,Users 是会变的。
属性也会变。

我知道mvc框架, 是用linq  但是我有不想用那种字符串截取的方式, 不知道还有没有更好的办法啊

#14


引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value; //这种需要自己实现索引器
……
你要得到什么属性应该知道吧?

            List<PropertyInfo> list = new List<PropertyInfo>();
            Type t = typeof(ClassA);
            string[] str = { "A", "B" };
            foreach (string s in str)
            {
                list.Add(t.GetProperty(s));
            }
            foreach (PropertyInfo p in list)
                Console.WriteLine(p.Name);
            Console.ReadLine();

#15


引用 14 楼 huangwenquan123 的回复:
引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Nam……



哎~~~  难道真的就没有那种, PropertyInfo 就没有, 让属性不可读的属性 
啊啊啊啊啊啊 
我是真不想用循环啊

#16


你不想循环就L2O,
不是都给了代码了吗?
User.Properties.Fist(p=>p.Key=="Name").Value

你套用到自己的反射出来的集合中不就可以了

#17


你是不是想要筛选出部分Property?你可以用自定义的Attribute进行过滤

#18


引用 15 楼 mybattlegod 的回复:
引用 14 楼 huangwenquan123 的回复:
引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));……

你能用多少反射啊?...
至于么,直接传你需要的属性名过去找啊

#19


User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????

#20


linq

#21


引用 19 楼 mybattlegod 的回复:
User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????


using System.Linq

#22


引用 21 楼 moneysoft 的回复:
引用 19 楼 mybattlegod 的回复:

User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????


using System.Linq




=,=
我用的是05的啊,这不是08的类库么, 
革皮了=,=啊 啊啊啊啊啊啊啊 啊

#23


饿饿,,
原来05里也有, 08里是默认就给引进来了
但是引完了, 还是没有这个方法a
是不是  08里才有的方法啊 - -!

#24


.net3.5
把你的vs升级到08吧,简单点

#25


反射的目标成员aa bb的名字你总该知道吧,筛选一下就行了

#26


 users.GetType().GetProperties().select(items=>items.aa&&items.bb);

#27


users.GetType().GetProperties().select(items=>string.format("{0},{1}",items.aa,items.bb)).ToArray()

帮你拼接了,,号分开,aa,bb为一个string的数组

#28


该回复于2011-07-26 10:50:22被版主删除

#29


哈哈, 不号意思啊, 这两天没上, 论坛的东西好几天没上了, 不好意思啊, 

感谢大家能踊跃的帮忙, 谢谢。

那个问题已经解决了, 不过第二个问题又出来了, 希望大家能帮忙解决一下问题, 最后一个了, 做大家
分就散了, 谢谢。


public static SqlParameter[] addparam(object obj)
        {
            SqlParameter[] pars = new SqlParameter[obj.GetType().GetProperties().Length];

            SqlParameter par = null; 

            PropertyInfo[] info = obj.GetType().GetProperties();

            for (int i = 0; i < pars.Length; i++)
            {
                //这个地方是动态参数、
                par = new SqlParameter("@" + info[i].Name, info[i].PropertyType);

                pars[i] = par;

                pars[i].Value = info[i].GetValue(obj,null);
            }

            return pars;
        }

问题来了啊,  我那个动态参数的地方, 
如果我用Datetime 类型的, 它没办法自动匹配上, 
而且还报错误,

将截断字符串或二进制数据。
语句已终止。

数据库的错误, 貌似是因为类型不匹配, 不知道大家有没有办法, 帮个忙啊, 谢谢了, 
我的框架就差最后这一步, 大家一定要帮帮啊, - -!

#30


ken die  a  a  a 

#1


.GetType().GetProperty("aa")

#2


把个别的属性放在基类中,你再集成,然后反射基类

#3


danjiewu
 
(阿丹)  .GetType().GetProperty("aa")

--------------------------------------------
我知道有这个方法啊, 但是这样做的话, 有点太不灵活了, 
我想找到一个可以能控制  实体类属性的方法,  

不知道大家有没有什么好的思路给提供一下啊

#4


 jsyhello
 
(不认输)     把个别的属性放在基类中,你再集成,然后反射基类
------------------------------------------------------------
我懂你的意思啊,  但是你想想,如果这样做的话岂不是很麻烦,  简单的实体类反射字段,
难道还要一个 抽象类, 我原来试过用  params 这个 ,动态参数 ,可是, 还是不行啊, 太麻烦了, 
7,8个的还行, 要是一个表里,  40,50的那种, 岂不是要累死, 不好啊, 愁死

 各位朋友, 多多提供思路啊

#5


给你返回个数组,而你只想用数组其中两个数据,这能有什么问题?

#6


从你的Info数组中查找其.Name叫做aa和bb的两个单元,这会产生什么问题?

你是不会foreach循环查找数组呢?还是不会new一个新的List<PropertyInfo>将这两个单元放入集合?

#7


引用 6 楼 sp1234 的回复:
从你的Info数组中查找其.Name叫做aa和bb的两个单元,这会产生什么问题?

你是不会foreach循环查找数组呢?还是不会new一个新的List<PropertyInfo>将这两个单元放入集合?




那要照你这么说的话, 是我问的太低端了, 还是您老人家的技术太高超了, 
那么我的问你了,   你说的 foreach 循环 OK
  如果 有20个属性, 给你循环的话 怎么办,  假如, 我的属性名字变了, 怎么办 , 这次我用的AA  BB
下个类型我用的是别的名字, 难道照你说我, 我要根据不同的属性, 写不同的方法, 

那跟手写mvc有什么区别,   我也就不会在这里提问了, 哥们。你懂得, 

#8


那就通过反射实例化类,在显示转换为对应的类,就可以点出那些属性!

#9


引用 8 楼 huangwenquan123 的回复:
那就通过反射实例化类,在显示转换为对应的类,就可以点出那些属性!


不是, 你理解错了啊 8楼的朋友,    
这么说吧, 我现在是可以找到当前的这个类型, 也可以获取相应的属性,  
但是我现在想要的效果就是 ,能控制他的属性, 
比如, 现在是这个类型, 我就想要  aa  bb的属性, 其他的属性, 在调用GetProperties();

方法的时候,去掉其他没用的属性,  我要的是这样的效果    
   呵呵, 
不过还是谢谢你能帮顶 ,  3Q

#10


属性名变?什么意思?属性名还能变啊?

#11


引用 10 楼 gengchenhui 的回复:
属性名变?什么意思?属性名还能变啊?

我的意思是, 要万一换个实体类,属性名不就是变了吗?
要灵活多变!!!!

#12


楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value;   //这种需要自己实现索引器
或者:
User.Properties.Fist(p=>p.Key=="Name").Value;   //利用现成的L2O

#13


引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value; //这种需要自己实现索引器
或者:
User.Properties.Fis……



感谢飞翔的心,  

可以你说的这个是在给实体类里面传值,  我想要的是这样, 

Users users = new Users();
users.aa="测试";
users.bb="测试";

PropertyInfo[] info = users.GetProperties();
现在我这里面是不是 除aa bb以外是不是还有其他的属性啊, 

StringBuilder sb = new StringBuilder();

    for (int i = 0; i < info.Length; i++)
    {
        sb.Append(i == 0 ? "" : ",");

        sb.Append(info[i].Name);
     }
那么我在这里的时候, 我想把其他不要的属性, 排除掉不让他获取, 
在假设, 我的Users  是Object   基类, 
我现在不知道我要排除什么属性,Users 是会变的。
属性也会变。

我知道mvc框架, 是用linq  但是我有不想用那种字符串截取的方式, 不知道还有没有更好的办法啊

#14


引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Name"].Value; //这种需要自己实现索引器
……
你要得到什么属性应该知道吧?

            List<PropertyInfo> list = new List<PropertyInfo>();
            Type t = typeof(ClassA);
            string[] str = { "A", "B" };
            foreach (string s in str)
            {
                list.Add(t.GetProperty(s));
            }
            foreach (PropertyInfo p in list)
                Console.WriteLine(p.Name);
            Console.ReadLine();

#15


引用 14 楼 huangwenquan123 的回复:
引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));
取值的时候:
User.Properties["Nam……



哎~~~  难道真的就没有那种, PropertyInfo 就没有, 让属性不可读的属性 
啊啊啊啊啊啊 
我是真不想用循环啊

#16


你不想循环就L2O,
不是都给了代码了吗?
User.Properties.Fist(p=>p.Key=="Name").Value

你套用到自己的反射出来的集合中不就可以了

#17


你是不是想要筛选出部分Property?你可以用自定义的Attribute进行过滤

#18


引用 15 楼 mybattlegod 的回复:
引用 14 楼 huangwenquan123 的回复:
引用 13 楼 mybattlegod 的回复:
引用 12 楼 moneysoft 的回复:
楼主,你需要的不是如此的class,也不是反射,
而是抽象描述数据特征
你的User只不过是个Key-Value集合而已,
比如这样写:
User.Properties.Add(New Property("Name","张三"));……

你能用多少反射啊?...
至于么,直接传你需要的属性名过去找啊

#19


User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????

#20


linq

#21


引用 19 楼 mybattlegod 的回复:
User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????


using System.Linq

#22


引用 21 楼 moneysoft 的回复:
引用 19 楼 mybattlegod 的回复:

User.Properties.Fist(p=>p.Key=="Name").Value;

---------------------------
飞翔的心

你这个 代码。。。。
我怎么点不到那个方法呢?
还是你们自己写的方法?????


using System.Linq




=,=
我用的是05的啊,这不是08的类库么, 
革皮了=,=啊 啊啊啊啊啊啊啊 啊

#23


饿饿,,
原来05里也有, 08里是默认就给引进来了
但是引完了, 还是没有这个方法a
是不是  08里才有的方法啊 - -!

#24


.net3.5
把你的vs升级到08吧,简单点

#25


反射的目标成员aa bb的名字你总该知道吧,筛选一下就行了

#26


 users.GetType().GetProperties().select(items=>items.aa&&items.bb);

#27


users.GetType().GetProperties().select(items=>string.format("{0},{1}",items.aa,items.bb)).ToArray()

帮你拼接了,,号分开,aa,bb为一个string的数组

#28


该回复于2011-07-26 10:50:22被版主删除

#29


哈哈, 不号意思啊, 这两天没上, 论坛的东西好几天没上了, 不好意思啊, 

感谢大家能踊跃的帮忙, 谢谢。

那个问题已经解决了, 不过第二个问题又出来了, 希望大家能帮忙解决一下问题, 最后一个了, 做大家
分就散了, 谢谢。


public static SqlParameter[] addparam(object obj)
        {
            SqlParameter[] pars = new SqlParameter[obj.GetType().GetProperties().Length];

            SqlParameter par = null; 

            PropertyInfo[] info = obj.GetType().GetProperties();

            for (int i = 0; i < pars.Length; i++)
            {
                //这个地方是动态参数、
                par = new SqlParameter("@" + info[i].Name, info[i].PropertyType);

                pars[i] = par;

                pars[i].Value = info[i].GetValue(obj,null);
            }

            return pars;
        }

问题来了啊,  我那个动态参数的地方, 
如果我用Datetime 类型的, 它没办法自动匹配上, 
而且还报错误,

将截断字符串或二进制数据。
语句已终止。

数据库的错误, 貌似是因为类型不匹配, 不知道大家有没有办法, 帮个忙啊, 谢谢了, 
我的框架就差最后这一步, 大家一定要帮帮啊, - -!

#30


ken die  a  a  a