2012-07-08 90 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错误。

相关问题