请解释为什么对象引用在我的代码中丢失
本文关键字:代码 我的 解释 为什么 对象引用 | 更新日期: 2023-09-27 17:57:52
嗨,我正在做一些与反射有关的事情,我不明白我的代码出了什么问题。然而,我试图清理我的代码,第一段代码不会更新我的实例值,当我通过调试器时,我可以从"newobj"中看到正确的结果,但是,由于没有更新我的示例值,"next"引用丢失了。我所做的唯一更改是将"this"添加到队列中,对我来说这并没有什么区别。有人能解释一下背后的原因吗?
private void UpdateBreathFirst()// This code is WRONG!!! but why?
{
RootQueue = new Queue<object>();
RootQueue.Enqueue(this);
while (RootQueue.Count > 0)
{
var next = RootQueue.Dequeue();
EnqueueChildren(next);
var newobj = next.GetType().GetMethod("Get").Invoke(next, null);
ValueAssign(next, newobj);
}
}
private void UpdateBreathFirst()//This code produces correct result.
{
RootQueue = new Queue<object>();
var val = GetType().GetMethod("Get").Invoke(this, null);
ValueAssign(this, val);
EnqueueChildren(this);
while (RootQueue.Count > 0)
{
var next = RootQueue.Dequeue();
EnqueueChildren(next);
var newobj = next.GetType().GetMethod("Get").Invoke(next, null);
ValueAssign(next, newobj);
}
}
其他支持代码
private Queue<object> RootQueue;
private void EnqueueChildren(object obj)
{
if (BaseTypeCompare(obj.GetType(), typeof(SerializedEntity<>)))
{
foreach (var propertyInfo in obj.GetType().GetProperties())
{
if (BaseTypeCompare(propertyInfo.PropertyType, typeof (List<>)))
{
var list = (IList) propertyInfo.GetValue(obj, null);
if (list != null)
{
foreach (object item in list)
{
RootQueue.Enqueue(item);
}
}
}
}
}
}
public static void ValueAssign(object a, object b)
{
foreach (var p in a.GetType().GetProperties())
{
foreach (var p2 in b.GetType().GetProperties())
{
if (p.Name == p2.Name && BaseTypeCompare(p.GetType(), p2.GetType()))
{
p.SetValue(a, p2.GetValue(b, null), null);
}
}
}
}
public static bool BaseTypeCompare(Type t, Type t2)
{
if (t.FullName.StartsWith(t2.FullName)) return true;
if (t == typeof(object)) return false;
return BaseTypeCompare(t.BaseType, t2);
}
我想我自己发现了问题,我的ValueAssign()有一些错误。我在网上找到了一个类似的方法,效果很好!
private static void CopyObject(object sourceObject, ref object destObject)
{
// If either the source, or destination is null, return
if (sourceObject == null || destObject == null)
return;
// Get the type of each object
Type sourceType = sourceObject.GetType();
Type targetType = destObject.GetType();
// Loop through the source properties
foreach (PropertyInfo p in sourceType.GetProperties())
{
// Get the matching property in the destination object
PropertyInfo targetObj = targetType.GetProperty(p.Name);
// If there is none, skip
if (targetObj == null)
continue;
// Set the value in the destination
targetObj.SetValue(destObject, p.GetValue(sourceObject, null), null);
}