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的值不改变啊
其次
我不太理解你这样做的意义。。
明明Set方法已经是Abc对象的内部方法了。
他是可以知道a方法的存在的。。为什么要这样多此一举的用反射来拉低运行效率。
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做一个网络客户端
然后可以通过反射直接调用我服务器端的A方法。
我原来使用大量的switch case来实现的。
不知道有什么好方法来替代原来的方法。。
我猜测是以下的代码段调用了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比较一下是不是一致。