请解释为什么对象引用在我的代码中丢失

本文关键字:代码 我的 解释 为什么 对象引用 | 更新日期: 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);
        }