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

时间:2011-05-29 19:01:35

标签: c# reflection this breadth-first-search

您好我正在做与Reflection有关的事情,我不明白我的代码有什么问题。我尝试清理我的代码但是,第一段代码不会更新我的实例值,当我单步执行调试器时,我可以看到“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);
}

1 个答案:

答案 0 :(得分:0)

我想我自己发现了自己的问题,我的ValueAssign()有一些bug。我在网上发现了一种类似的方法,它完美无缺!

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);
        }