public class Abc{
     public string UserName="";
     public void a(){
          this.UserName = "What the fucking chinese english!";
     }
     public void Set(){
         foreach(var item in typeof(Abc).GetMethods()){
             if(item.Name == "a"){
                  item.Invoke(this,null);
             }
         }
     }
}实例化这个Abc对象之后
调用Set方法 之后为什么UserName的值不改变啊

解决方案 »

  1.   

    首先,信息不足。把你的执行代码发出来看看
    其次
    我不太理解你这样做的意义。。
    明明Set方法已经是Abc对象的内部方法了。
    他是可以知道a方法的存在的。。为什么要这样多此一举的用反射来拉低运行效率。
      

  2.   

    嗯源代码东西太多 太乱 其实我想问的就是这里通过反射调用一个方法后
    a方法已经执行了 a方法执行后他对Abc对象的实例中的属性修改后并未真实修改
    public class SocketService : IDisposable
        {
            private System.Reflection.MethodInfo[] Method;        public string UserName { get; set; }        public SocketService(Socket socket)
            {
                this.Method = typeof(SocketService).GetMethods();            this._Socket = socket;            Thread thread = new Thread(() =>
                {
                    try
                    {
                        while (true)
                        {
                            try
                            {
                                byte[] source = new byte[65535];
                                int length = _Socket.Receive(source);
                                var entity = source.Deserialize();
                                var type = entity.GetType();
                                foreach (var item in Method)
                                {
                                    if (item.Name == type.Name)
                                    {
                                        var res = item.Invoke(this, new object[] { entity });
                                        break;
                                    }
                                }
                            }
                            catch {}
                        }
                    }
                    catch { }
                });
                thread.IsBackground = true;
                thread.Start();
                #endregion
            }
            public void A(){
                //A方法在这了。这里修改UserName 不管用
            }
        }我是用Socket做一个网络客户端
      

  3.   

    我的用意是 客户端发来一个请求实体类A里面包含一些请求的参数
    然后可以通过反射直接调用我服务器端的A方法。
    我原来使用大量的switch case来实现的。
    不知道有什么好方法来替代原来的方法。。
      

  4.   

    看了一下代码
    我猜测是以下的代码段调用了a?foreach (var item in Method)
                                {
                                    if (item.Name == type.Name)
                                    {
                                        var res = item.Invoke(this, new object[] { entity });
                                        break;
                                    }
                                }你可以考虑在A里面设断点。
    看是否真的进A了。
    如果进了A判断一下A里面执行反射的对象和this的hashcode是不是一致。
    如果是一致的。再将此hashcode与你查看是否改变了username的对象的hashcode比较一下是不是一致。
      

  5.   

    HashCode是个啥 这个对象的唯一内存标示???