2010-12-15 7 views
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? 
} 

Wie oben beschrieben, ist test.B kein Mitglied von 'test'. Aber wie kann ich wissen, dass B ruft? Der einzige Weg, den ich gefunden habe, ist in ex.Message zu schauen, aber es ist kein richtiger Weg.Wie bekomme ich den Mitgliedsnamen des expando Objekts?

Antwort

2

Es wird einfacher, wenn Sie DynamicObject statt ExpandoObject verwenden.

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

Versuchen Sie es mit der 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; 
}