//我想实现一个功能,那就是向如下这个函数传入任意一个对象,并将这个对象的zz成员赋值为5,同时显示出来,但是编译时总是报错,请问,C#是不是不允许这样做,如果不允许,那么我如何实现用一个函数向一个包含zz成员的对象赋值??
(假设编写者总是在调用这个函数时去确定其是否具有zz成员,而在编写这个函数时他是不知道将会有什么类型的对象调用该函数的)
 public static void wori(object mx)
{
   mx.zz = 5;
   MessageBox.Show(mx.zz.ToString());
 } public static void wori(ref object mx)
{
   mx.zz = 5;
   MessageBox.Show(mx.zz.ToString());
 }
//我发现VB.NET实现这个函数是允许的.C#是可以实现这个功能的,它可以通过更严格的接口来实现,首先判断这个对象是否实现了某个接口,然后在满足接口的前提下将object转化为指定的对象,然后就可以调用其相关的成员.但是这种方法和上面的方法有一个本质的区别,上面的是一种泛型转化,而如果使用接口判断并转化,意味着在创建这个函数时必然使得其"认识"那些类型,这与函数简化是相违背的.请问对于C#来说,是否存在一种方法:它不必认识这些传入的对象,就能调用执行它们制定的成员(是否用接口实现)?

解决方案 »

  1.   

    用反射。
     public static void wori(object mx)
            {
                Type t = mx.GetType();
                FieldInfo f = t.GetField("zz");
                f.SetValue(mx, 5);
                int v = (int)f.GetValue(mx);
                
                MessageBox.Show(v.ToString());
            }
      

  2.   

    public interface IMyInterface{
    int xx{set;get;}
    }public static void wori(IMyInterface mx){
       mx.zz = 5;
       MessageBox.Show(mx.zz.ToString());
    }
      

  3.   

    不好意思,IMyInterface里面应该是zz不是xx。
      

  4.   

    还可以使用反射来做,例如:
            private object xxx(object o) {
                PropertyInfo pi = o.GetType().GetProperty("zz");
                if (pi != null) {
                    return pi.GetValue(o, null); 
                }
                return null;
            }
      

  5.   

    我记得.net3.5 支持dynamic调用的,也就是运行时检查对象类型