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. 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. バインドコア(System.Dynamic.DynamicMetaObjectBinder ペイロード、System.Collections.Generic.IEnumerable パラメーター、System.Dynamic.DynamicMetaObject[] args、out System.Dynamic.DynamicMetaObject deferredBinding) + 0xbc バイト
Microsoft.CSharp.RuntimeBinder.RuntimeBinder. Bind (System.Dynamic.DynamicMetaObjectBinder ペイロード、System.Collections.Generic.IEnumerable パラメーター、System.Dynamic.DynamicMetaObject[] args、out System.Dynamic.DynamicMetaObject deferredBinding) + 0x56 バイト
Microsoft.CSharp.RuntimeBinder.BinderHelper. 練る(System.Dynamic.DynamicMetaObjectBinder アクション、Microsoft.CSharp.RuntimeBinder.RuntimeBinder バインダー、System.Collections.Generic.IEnumerable 引数、System.Collections.Generic.IEnumerable arginfo、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[] 引数) + 0xb8 バイト System.Dynamic.InvokeMemberBinder.Bind(System.Dynamic.DynamicMetaObject ターゲット、System.Dynamic.DynamicMetaObject[] 引数) + 0x36 バイト System.Dynamic .DynamicMetaObjectBinder.Bind(object[] 引数、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、10 進数 arg1、double arg2) + 0x30e バイト MyApp.DynCallsite. マイメソッド(文字列 str1、10 進数、文字列 str2) 96 行目 + 0x17d バイト C#

特殊な派生クラスの代わりに DynamicObject インスタンスを使用しているように見えます。ただし、デバッガーで callsite オブジェクトを調べると、DynCallsite と表示されるため、そうではないことを確認しました。何が原因でしょうか?

4

1 に答える 1

0

dynamic を直接使用するとうまくいくと思います。問題は、プロパティを通じて返品することです。この方法は、WPF データバインディングで機能します。Dynamic を DataContext として直接指定すると、バインドが機能します。あなたが使用したようにプロパティを使用すると、バインディングエラーが発生します。

于 2012-07-27T09:18:53.940 に答える