簡體   English   中英

請解釋為什么 object 參考在我的代碼中丟失

[英]Please explain why the object reference lost in my code

嗨,我正在做一些與反射有關的事情,我不明白我的代碼有什么問題。 我嘗試清理我的代碼但是,第一段代碼不會更新我的實例值,當我單步執行調試器時,我可以從“newobj”看到正確的結果,但是“下一個”引用由於以下原因而丟失不更新我的實例值。 我所做的唯一更改是將“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);
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM