1
dynamic test = new ExpandoObject();
test.A = "ok";

try{
    Console.WriteLine(test.B);
}
catch (Microsoft.CSharp.RuntimeBinder.RuntimeBinderException ex){
    // how can i know that B was invoke?
}

上記のコードのように、test.Bは「test」のメンバーではありません。しかし、どうすれば「B」が呼び出していることを知ることができます。私が見つけた唯一の方法はex.Messageを調べることですが、それは適切な方法ではありません。

4

2 に答える 2

2

を使用してみてくださいStackFrame

catch (Exception e)
{
    StackTrace st = new StackTrace();
    StackTrace st1 = new StackTrace(new StackFrame(true));
    Console.WriteLine(" Stack trace for Method1: {0}",
       st1.ToString());
    Console.WriteLine(st.ToString());
    throw e;
}
于 2010-12-15T06:17:21.210 に答える
2

DynamicObjectの代わりに使用すると簡単になりますExpandoObject

class MyDynamicObject : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        Console.WriteLine(binder.Name);
         //simply prints the name, you can raise an event here or something else
        return base.TryGetMember(binder, out result);
    }
}
于 2010-12-15T07:03:27.680 に答える