Как получить вызывающее имя члена объекта расширения? - PullRequest
1 голос
/ 15 декабря 2010
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'.Но как я могу знать, что «Б» звонит.Единственный способ, который я нашел, - это посмотреть на ex.Message, но это неправильный способ.

Ответы [ 2 ]

2 голосов
/ 15 декабря 2010

Будет проще, если вы будете использовать 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);
    }
}
2 голосов
/ 15 декабря 2010

Попробуйте использовать 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;
}
...