0

我的 DynamicObject 实现如下所示:

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 字节
Microsoft.CSharp.RuntimeBinder.Semantics.LangCompiler。SubmitError(Microsoft.CSharp.RuntimeBinder.Errors.CParameterizedError 错误)+ 0x24 字节
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 字节
Microsoft.CSharp.RuntimeBinder.RuntimeBinder。绑定调用(Microsoft.CSharp.RuntimeBinder.ICSharpInvokeOrInvokeMemberBinder 有效负载、Microsoft.CSharp.RuntimeBinder.Semantics.EXPR 调用对象、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。绑定核心(System.Dynamic.DynamicMetaObjectBinder 有效负载,System.Collections.Generic.IEnumerable 参数,System.Dynamic.DynamicMetaObject[] args,出 System.Dynamic.DynamicMetaObject deferredBinding)+ 0xbc 字节
Microsoft.CSharp.RuntimeBinder.RuntimeBinder。绑定(System.Dynamic.DynamicMetaObjectBinder 有效负载,System.Collections.Generic.IEnumerable 参数,System.Dynamic.DynamicMetaObject[] args,输出 System.Dynamic.DynamicMetaObject deferredBinding)+ 0x56 字节
Microsoft.CSharp.RuntimeBinder.BinderHelper。绑定(System.Dynamic.DynamicMetaObjectBinder 操作,Microsoft.CSharp.RuntimeBinder.RuntimeBinder 绑定器,System.Collections.Generic.IEnumerable args,System.Collections.Generic.IEnumerable arginfos,System.Dynamic.DynamicMetaObject onBindingError)+ 0x2ca 字节 Microsoft.CSharp.RuntimeBinder .CSharpInvokeMemberBinder。FallbackInvokeMember(System.Dynamic.DynamicMetaObject 目标,System.Dynamic.DynamicMetaObject[] args,System.Dynamic.DynamicMetaObject errorSuggestion)+ 0x77 字节
System.Dynamic.DynamicObject.MetaDynamic.BindInvokeMember。AnonymousMethod__10 (System.Dynamic.DynamicMetaObject e) + 0x1b 字节
System.Dynamic.DynamicObject.MetaDynamic。BindInvokeMember(System.Dynamic.InvokeMemberBinder 绑定器,System.Dynamic.DynamicMetaObject[] args)+ 0xb8 字节 System.Dynamic.InvokeMemberBinder.Bind(System.Dynamic.DynamicMetaObject 目标,System.Dynamic.DynamicMetaObject[] args)+ 0x36 字节 System.Dynamic .DynamicMetaObjectBinder.Bind(object[] args, System.Collections.ObjectModel.ReadOnlyCollection 参数, System.Linq.Expressions.LabelTarget returnLabel) + 0xea 字节 System.Runtime.CompilerServices.CallSiteBinder。BindCore >(System.Runtime.CompilerServices.CallSite> site, object[] args) + 0x80 字节 System.Dynamic.UpdateDelegates。UpdateAndExecuteVoid3(System.Runtime.CompilerServices.CallSite 站点,对象 arg0,十进制 arg1,双 arg2)+ 0x30e 字节 MyApp.DynCallsite。我的方法(字符串 str1,十进制数,字符串 str2)第 96 行 + 0x17d 字节 C#

看起来好像我使用的是 DynamicObject 实例而不是我的专门派生类。但是,我确认不是这种情况,因为我可以在调试器中检查调用站点对象,它显示的是 DynCallsite。什么可能导致这种情况?

4

1 回答 1

0

我想如果你直接使用动态它会起作用。问题可能是您通过属性返回它。这种方式适用于 WPF 数据绑定。如果我直接将动态作为 DataContext 提供,则绑定有效。如果我像你一样使用属性,我会得到绑定错误。

于 2012-07-27T09:18:53.940 回答