我使用反射來更新他們不得不他們所做的更新對象,並保存到MongoDB的C#反射的SetValue()無法找到set訪問
private void updateSelf(MongoDoc newDoc)
{
Type type = this.GetType();
foreach (var i in type.GetProperties())
{
if (i.GetCustomAttributes(false).Any(x => x is MongoDB.Bson.Serialization.Attributes.BsonIgnoreAttribute)) continue;
Object oldValue = i.GetValue(this, null);
Object newValue = i.GetValue(newDoc, null);
if (!Object.Equals(oldValue, newValue) && !((oldValue == null) && (newValue == null)))
{
i.SetValue(this, newValue, null);
}
}
}
這是工作的大部分,但i.SetValue(this, newValue, null);
拋出一個異常試圖更新該屬性時:
public uint Revision { get; private set; }
此試圖更新Product
類型的對象是這是造成異常0123的MongoDoc
其包含屬性public uint Revision { get; private set; }
派生類型我不確定是什麼導致了這個問題,因爲它適用於我所有的其他屬性,只是這個引發了異常。任何幫助非常讚賞
UPDATE:
我曾嘗試下面的答案:
i.SetValue(this, newValue, System.Reflection.BindingFlags.SetProperty | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic, null, null, null);
但不幸的是完全相同的結果,但它仍然拋出的修訂財產除外。
UPDATE:
例外:
System.ArgumentException was unhandled
Message=Property set method not found.
Source=mscorlib
StackTrace:
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
at System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index)
at Flo.Client.Docs.MongoDoc.updateSelf(MongoDoc newDoc) in F:\Flo\Flo.Client\Docs\MongoDoc.cs:line 162
at Flo.Client.Docs.MongoDoc.UpdateToMongo(MongoDoc newDoc) in F:\Flo\Flo.Client\Docs\MongoDoc.cs:line 120
at Flo.Client.Docs.Product.EditProduct(String Name, Nullable`1 State) in F:\Flo\Flo.Client\Docs\Product.cs:line 89
at Flo.Client.Program.Main() in F:\Flo\Flo.Client\Program.cs:line 26
at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException:
你的房屋都有'私人設置'訪問? –
是的,這就是讓我困惑的原因「我想也許這是因爲屬性設置訪問器是私人的」但是我的其他屬性也有私有設置訪問器,並且它們會被寫入到很好的狀態,而且我讀了一些反射並不關心的地方關於財產訪問者的級別,只要財產本身是公開的,就可以得到它。 – 0xor1
是'Product'類還是'MongoDoc'類的'Revision'屬性? –