17

これはDynamicObjectクラスの一部です:

public class DynamicObject : IDynamicMetaObjectProvider
{ 
    ...
    public virtual bool TryInvoke(InvokeBinder binder, object[] args, out object result)
    {
      result = (object) null;
      return false;
    }
    ...
    public virtual bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
    {
      result = (object) null;
      return false;
    }
}

MSDN から:
TryInvoke: オブジェクトを呼び出す操作
TryInvokeMemberの実装を提供します : メンバーを呼び出す操作の実装を提供します

この 2 つのメソッドの構文と実装はほぼ同じであるため、この 2 つのメソッドの本当の違いを知りたいです。オブジェクトまたはデリゲートの場合はTryInvoke、メソッドの場合はTryInvokeMemberであることはすでに知っていますが、なぜこれに2つのメソッドがあるのでしょうか? 良い例をいただければ幸いです。

4

2 に答える 2

16

ドキュメントはあまり明確ではありませんが、TryInvokeTryInvokeMemberの例 は違いを示しています。 TryInvokeオブジェクトを呼び出すときに呼び出され (つまり、デリゲートのように扱います) TryInvokeMember、オブジェクトのメソッドを呼び出すときに使用されます。

以下の例は、MSDN サンプルから派生したものです。

dynamic number;
....
// Invoking an object. 
// The TryInvoke method is called.
number(2, "Two");

// Calling a method
// The TryInvokeMember method is called.
number.Clear();

表示している実装は両方とも null 実装であるため、同じです。false を返すことは、呼び出されようとしているメソッドが実装されていないことを意味します。

null 以外の実装があった場合の違いは、どのメソッドが呼び出されるかを決定するためにプロパティをTryInvokeMember調べ、binder.Nameに対しては設定されないことですTryInvoke

于 2012-10-28T19:04:25.180 に答える
1

また

Console.WriteLine(number); //オブジェクトを呼び出し、TryInvokeメソッドが呼び出されます

于 2013-03-12T21:35:02.837 に答える