2012-07-08 232 views
0

我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。什麼會造成這種情況?

+1

你沒有展示你如何使用*對象。如果你能製作一個簡短但完整的程序來展示問題,那真的會有所幫助。 – 2012-07-08 17:33:30

+0

爲了防止'我不知道未來會發生什麼變化',請考慮使用版本控制系統,比如[mercurial](http://hginit.com/)。 – Adam 2012-07-08 17:37:41

+0

我添加了一個用法的例子。 – 2012-07-08 17:40:33

回答

0

我想如果你直接使用動態,它會工作。問題可能是你通過財產歸還。這種方式在WPF數據綁定中起作用。如果我直接作爲DataContext動態賦值,綁定就起作用。如果我使用屬性,你會遇到bindig錯誤。

相關問題