我DynamicObject實施看起來是這樣的:爲什麼我的TryInvokeMember未被調用?
public class DynCallsite: DynamicObject
{
public DynCallsite(ScriptPlayer player)
{
_player = player;
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var ftt = new CallTranslator();
var request = ftt.CreateXmlRequest(binder.Name, args);
var callResult = _player.CallFunction(request);
result = ftt.DeserializeXmlRequest(callResult);
return true;
}
private ScriptPlayer _player;
}
這是我如何使用這個對象的實例:
class DynHost
{
public DynHost()
{
_callSite = new DynCallsite(new ScriptPlayer());
}
public dynamic Callsite
{
get { return _callsite; } // A breakpoint put here will be hit
}
}
// *snip*
var dh = new DynHost();
dh.Callsite.MyMethod("str1", 5, "str2");
它用於工作:),我不知道什麼改變了。調試器不打破TryInvokeMember調用,我得到RuntimeBinderException
。這個類在不同的程序集中定義,而不是正在運行的程序集(通過從同一個解決方案中添加對項目的引用,以正常的方式引用它)。
上的一個實例進行通話後,我發現了以下堆棧跟蹤:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderController。 SubmitError(Microsoft.CSharp.RuntimeBinder.Errors.CError pError)+ 0x23 bytes
Microsoft.CSharp.RuntimeBinder.Semantics.LangCompiler。 SubmitError(Microsoft.CSharp.RuntimeBinder.Errors.CParameterizedError error)+ 0x24 bytes
Microsoft.CSharp.RuntimeBinder.Errors.ErrorHandling。 ErrorTreeArgs(Microsoft.CSharp.RuntimeBinder.Errors.ErrorCode ID,Microsoft.CSharp.RuntimeBinder.Errors.ErrArg [] prgarg)+ 0x53 字節 Microsoft.CSharp.RuntimeBinder.Semantics.MemberLookup。 ReportErrors()+ 0x6cd bytes
Microsoft.CSharp.RuntimeBinder.RuntimeBinder。 BindCall(Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder 有效載荷,Microsoft.CSharp.RuntimeBinder.Semantics.EXPR callingObject, Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [] 參數, System.Collections.Generic.Dictionary 字典)+ 0x206字節 Microsoft.CSharp.RuntimeBinder.RuntimeBinder。 DispatchPayload(System.Dynamic.DynamicMetaObjectBinder 有效載荷,Microsoft.CSharp.RuntimeBinder.RuntimeBinder.ArgumentObject [] 參數, System.Collections.Generic.Dictionary 字典)+ 0xb1字節
Microsoft.CSharp.RuntimeBinder.RuntimeBinder。 BindCore(System.Dynamic.DynamicMetaObjectBinder 有效載荷, System.Collections.Generic.IEnumerable 參數,System.Dynamic.DynamicMetaObject []指定參數時,出 System.Dynamic.DynamicMetaObject deferredBinding)+ 0xbc字節
Microsoft.CSharp。 RuntimeBinder.RuntimeBinder。 綁定(System.Dynamic.DynamicMetaObjectBinder 有效載荷, System.Collections.Generic.IEnumerable 參數,System.Dynamic.DynamicMetaObject []指定參數時,出 System.Dynamic.DynamicMetaObject deferredBinding)+ 0x56儲存字節
Microsoft.CSharp。 RuntimeBinder.BinderHelper。 Bind(System.Dynamic.DynamicMetaObjectBinder action,Microsoft.CSharp.RuntimeBinder.RuntimeBinder binder, System.Collections.Generic。IEnumerable的 指定參數時, System.Collections.Generic.IEnumerable arginfos,System.Dynamic.DynamicMetaObject onBindingError)+ 0x2ca 字節 Microsoft.CSharp.RuntimeBinder.CSharpInvokeMemberBinder。 FallbackInvokeMember(System.Dynamic.DynamicMetaObject 目標,System.Dynamic.DynamicMetaObject []指定參數時, System.Dynamic.DynamicMetaObject errorSuggestion)+ 0x77字節
System.Dynamic.DynamicObject.MetaDynamic.BindInvokeMember。 AnonymousMethod__10(System.Dynamic.DynamicMetaObject e)+ 0x1b bytes
System.Dynamic.DynamicObject.MetaDynamic。 BindInvokeMember(System.Dynamic.InvokeMemberBinder 粘合劑,System.Dynamic.DynamicMetaObject []參數)+ 0xb8字節 System.Dynamic.InvokeMemberBinder.Bind(System.Dynamic.DynamicMetaObject 目標,System.Dynamic.DynamicMetaObject []參數) + 0x36字節 System.Dynamic.DynamicMetaObjectBinder.Bind(對象[]指定參數時, System.Collections.ObjectModel.ReadOnlyCollection 參數,System.Linq.Expressions.LabelTarget returnLabel)+ 0xea 字節 System.Runtime.CompilerServices.CallSiteBinder。 BindCore>(System.Runtime.CompilerServices.CallSite> site,object [] args)+ 0x80 bytes System.Dynamic.UpdateDelegates。 UpdateAndExecuteVoid3(System.Runtime.CompilerServices.CallSite site,object arg0,decimal arg1,double arg2)+ 0x30e bytes MyApp.DynCallsite。 的MyMethod(串STR1,十進制數,字符串STR2)線96個+ 0x17d字節C#
它非常的樣子,就好像我是使用DynamicObject實例,而不是我的專業派生類。但是,我確認情況並非如此,因爲我可以在調試器中檢查調用站點對象,並且它說DynCallsite。什麼會造成這種情況?
你沒有展示你如何使用*對象。如果你能製作一個簡短但完整的程序來展示問題,那真的會有所幫助。 – 2012-07-08 17:33:30
爲了防止'我不知道未來會發生什麼變化',請考慮使用版本控制系統,比如[mercurial](http://hginit.com/)。 – Adam 2012-07-08 17:37:41
我添加了一個用法的例子。 – 2012-07-08 17:40:33