5

C# 4.0 には、新しい DynamicObject があります。

存在しないメソッドを呼び出そうとしたときに呼び出される「魔法のメソッド」TryInvokeMember() を提供します。

http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.tryinvokemember%28VS.100%29.aspx

私が知りたいのは、定義クラスの外部から保護されたメソッドを呼び出そうとしたときに TryInvokeMember() が呼び出されるかどうかです。

私は、この状況で同等の「魔法のメソッド」__call() を呼び出す PHP との動作を比較しています。

4

1 に答える 1

6

(標準の C# アクセス ルールを使用して) アクセスできないメソッドを呼び出す呼び出しを作成すると、アクセスできないメソッドは呼び出されず、ランタイムはTryInvokeMember(他の方法で呼び出しを処理できる場所で) を呼び出します。 . 以下に例を示しますので、試してみてください。

class Test : DynamicObject {
  public void Foo() {
    Console.WriteLine("Foo called");
  }
  protected void Bar() {
    Console.WriteLine("Bar called");
  }

  public override bool TryInvokeMember
      (InvokeMemberBinder binder, object[] args, out object result) {
    Console.WriteLine("Calling: " + binder.Name);
    return base.TryInvokeMember(binder, args, out result);
  }
}

これで、オブジェクトのインスタンスを作成し、そのメソッドのいくつかを呼び出してみることができます:

dynamic d = new Test();
d.Foo(); // this will call 'Foo' directly (without calling 'TryInvokeMember')
d.Bar(); // this will call 'TryInvokeMember' and then throw exception

そのため、 のbase実装をTryInvokeMember呼び出すと、アクセスできないメソッドを呼び出すと C# 動的バインダーは失敗しますが、TryInvokeMember( を何らかの値に設定してresultを返すことによりtrue) でケースの独自の処理を定義できます。

于 2010-03-04T23:08:27.160 に答える