//有一个实体类Member  
 public class   Member
{
   public Member() { }
   private string _id;
   private string _name;
   private SexType _sex;
   public string ID()
   {
     get{ return _id; } set { _id=value; }
   }
   public string Name()
   {
     get{ return _name; } set { name=value; }
   }
    public SexType Sex()
   {
     get{ return _sex; } set { _sex=value; }
   }       
}
//有一个枚举
public enum EduLevelType
{
   man   = 0,
   woman = 1

//对枚举赋值的一个通用方法(其实还有很多操作,这里简化了)              
public void Source(Object obj,int intID)
{
   Type t = obj.GetType();
   System.Reflection.PropertyInfo[] PS = t.GetProperties();
   int ID;
   for (ID = 0; ID < PS.Length; ID++)
   {
     //当属性是枚举类型时
     if(PS[ID].PropertyType.IsEnum)
     {
        //对枚举类型的属性Sex进行赋值,怎样实现呢 //如果直接这样做,是不行的:PS[ID].SetValue(obj, intID, null);
     }
     
   }方法引用:Member mem = new Member(); 
          Source(mem ,1);结果应该是:mem.Sex = woman;

解决方案 »

  1.   

    if(PS[ID].PropertyType.IsEnum)此时,已判断为枚举类型了.赋值再赋int肯定不行吧?你试下,直接赋值枚举值.比如:EduLevelType.woman
      

  2.   

    回复:sxlfybb(房客) 如果是直接赋EduLevelType.woman的话,那这个方法就不能通用了
      

  3.   

    回复:wdzr_826(舞指如歌(俺也是学点奈特的)) 
    没办法,公司一定要用枚举,用那三层架构写的代码太多了,效率太低,自己就想写几个通用的方法。
      

  4.   

    没办法,公司一定要用枚举,用那三层架构写的代码太多了,效率太低,自己就想写几个通用的方法System.Reflection.PropertyInfo[] PS = t.GetProperties();=====
    1。
    丫,反射都出来了2。
    代码多?你应该考虑使用,代码生成工具,3。
    而反射通常正是给这些开发工具、IDE使用的,而不是用在实际应用系统中的,虽然你这样省了敲代码的力气,但是代码的是性能的大大降低,4。
    想想,这个反射得由多少方法来调用啊,再加上每个方法中 while(xxxDataReader.Read()) ...一循环,服务器负载可想而知,
    也许你会告诉我,不用考虑,硬件资源...5。
    像这样的代码IList<Member> members;
    // ...
    Member member;
    while(xxxDataReader.Read()) {
        member = new Member();
        member = (SexType)xxxDataReader.GetInt32(SexTypeColumnIndex);
        // ...
        members.Add(member);
    }完全可以由代码生成工具生成。
      

  5.   

    回复:Jinglecat(晓风残月 >> 问题需简洁,错误要详细) 
    说得很对,但有时候做些小项目的东西,就不会考虑得那么多了。我现在主要是写了几个方法:把一个实体的值写入数据库、根据一个实体的值的改变修改数据库、删除数据库纪录、把表单控件的值写入实体、把实体的值显示在表单控件上。
    至于查询,对每个表我都进行单独的处理,用得最多的应该也就是查询了
      

  6.   

    大致是:if(PS[ID].PropertyType.IsEnum)
         {
            PS[ID].SetValue(obj, System.Enum.GetValues(PS[ID].PropertyType)[intID], null);
         }不过我似乎没有看懂你定义这个方法接口
        Source(Object obj,int intID)
    的逻辑。奇怪,或者在设计上是错误的。
      

  7.   

    也可以使用 System.Enum.ToObject 来更快地取得 intID 对应的枚举值。
      

  8.   

    1。
    intID 是要赋的枚举值???》》》if(PS[ID].PropertyType.IsEnum)
    {
    PS[ID].SetValue(obj, Enum.Parse(PS[ID].PropertyType, intID), null);
    }2。
    Source 方法设计的有问题,没有多大价值,通过反射,只是赋一个枚举的值,太浪费了,要自动化,就得从 DataReader 读取的时,通过反射,赋值所有属性
      

  9.   

    --- 通过反射,只是赋一个枚举的值,太浪费了,不是的,通过反射,我是想把form表单的值都写进实体的,只是对于枚举的赋值我不懂,那个source方法就只是那样写而已
      

  10.   

    PS[ID].SetValue(obj,System.Enum.Parse(PS[ID].PropertyType,intID.ToString()),null) 这样就可以了。那根据枚举的值怎样获取对应的整型值呢,如现在知道了mem.Sex = woman;如何得到值1呢
      

  11.   

    唉呀,我忘了问这个问题了Jinglecat(晓风残月 >> 问题需简洁,错误要详细)、sp1234(与其赌博赚钱,不如自己开赌场)还在吗。
      

  12.   

    枚举赋值都没用过,不过你的实体有点太简单了,最好加上Attribute,表明那些是映射数据库的,哪些是附加的业务上的辅助字段但是反射用得太多了,性能会有很大的副作用,比如循环中的N个实体,在WEB中多用户并发,这种消耗是很大的!
      

  13.   

    回复:WNASP(这年头什么都“和谐”) 
    ----但是反射用得太多了,性能会有很大的副作用,比如循环中的N个实体,在WEB中多用户并发,这种消耗是很大的!
        我也不知道应该怎样写方法了,大家都说反射不好,但对于实体来说,我想不出怎样的办法了。难道三层架构真的要写这么多代码吗?虽然有代码生成工具,但是如果改一些字段的话,改起来很嘛烦的。----枚举赋值都没用过,不过你的实体有点太简单了,最好加上Attribute,表明那些是映射数据库的,哪些是附加的业务上的辅助字段
        可以写一个属性我看一下吗这样做的好处是什么呢
      

  14.   

    在即时窗口敲了大半天,终于给我试到了,Convert.ToInt32(System.Enum.Parse(PS[ID].PropertyType, "woman")) 这样就可以得到1了,可能很少人会用我这种笨方法吧,所以不知我问的是什么没办法了以我的水平暂时只能写到这个地步了。