[英]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.