Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的TryInvokeMember没有被调用?_C#_Dynamic_Dynamicobject - Fatal编程技术网

C# 为什么我的TryInvokeMember没有被调用?

C# 为什么我的TryInvokeMember没有被调用?,c#,dynamic,dynamicobject,C#,Dynamic,Dynamicobject,我的DynamicObject实现如下所示: public class DynCallsite: DynamicObject { public DynCallsite(ScriptPlayer player) { _player = player; } public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)

我的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.CPParameterizedError 错误)+0x24字节
Microsoft.CSharp.RuntimeBinder.Errors.ErrorHandling.ErrorTreeArgs(Microsoft.CSharp.RuntimeBinder.Errors.ErrorCode id,Microsoft.CSharp.RuntimeBinder.Errors.Errors.ErrArg[]prgarg)+0x53 字节 Microsoft.CSharp.RuntimeBinder.Semantics.MemberLookup.报告错误()+ 0x6cd字节
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.绑定(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[]参数, System.Dynamic.DynamicMetaObject errorSuggestion)+0x77字节
System.Dynamic.DynamicObject.MetaDynamic.BindInvokeMember.匿名方法\uuu 10(System.Dynamic.DynamicMetaObject e) +0x1b字节
System.Dynamic.DynamicObject.MetaDynamic.BindInvokeMember(System.Dynamic.InvokeMememberBinder 活页夹,System.Dynamic.DynamicMetaObject[]args)+0xb8字节 System.Dynamic.InvokeMemberBinder.Bind(System.Dynamic.DynamicMetaObject 目标,System.Dynamic.DynamicMetaObject[]args)+0x36字节 System.Dynamic.DynamicMetaObjectBinder.Bind(对象[]参数, System.Collections.ObjectModel.ReadOnlyCollection 参数,System.Linq.Expressions.LabelTarget returnLabel)+0xea 字节 System.Runtime.CompilerServices.CallSiteBinder.BindCore>(System.Runtime.CompilerServices.CallSite> 站点,对象[]args)+0x80字节 System.Dynamic.UpdateDelegates.更新索引执行无效3(System.Runtime.CompilerServices.CallSite 站点,对象arg0,十进制arg1,双arg2)+0x30e字节 MyApp.DynCallsite.MyMethod(字符串str1,十进制数,字符串str2)第96行+0x17d字节C#


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

我想如果您直接使用dynamic,它会起作用。问题可能是您通过属性返回它。这种方法在WPF数据绑定中起作用。如果我直接将dynamic作为DataContext提供,绑定就可以工作。如果我像您使用的那样使用属性,则会出现bindig错误。

您尚未显示如何使用该对象。如果你能制作一个简短而完整的程序来演示这个问题,那真的很有帮助。为了防止<代码>,我不确定什么改变了未来的时刻,考虑使用一个版本控制系统,比如,谢谢,我现在处于良好的状态(快乐的Git用户将近2年),但这是一个我没有实现的老项目:)嘿,我想知道你是否也应该覆盖
TryGetMember
它返回true或false,告诉DLR实例中是否存在该成员。我确实实现了TryGetMember和TrySetMember,但我认为它们是用于属性类型的东西(它们也相应地实现了)。由于脚本对象将接受不存在的属性,因此它们总是返回true(并获取/设置播放器的动态属性)。它们中的断点也不会被命中。