2011-06-09 7 views
18

me gustaría ser capaz de hacer algo como lo siguiente:.net aplicación DynamicObject que devuelve un valor nulo para las propiedades que faltan en vez de un RunTimeBinderException

dynamic a = new ExpandoObject(); 
Console.WriteLine(a.SomeProperty ?? "No such member"); 

pero que lanza

RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw' 

¿Te saber de una implementación de DynamicObject que devolvería null para las definiciones faltantes, o un tutorial sobre cómo crear una? ¡Muchas gracias!

Respuesta

30

¿Algo como esto?

using System; 
using System.Collections.Generic; 
using System.Dynamic; 

public class NullingExpandoObject : DynamicObject 
{ 
    private readonly Dictionary<string, object> values 
     = new Dictionary<string, object>(); 

    public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     // We don't care about the return value... 
     values.TryGetValue(binder.Name, out result); 
     return true; 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     values[binder.Name] = value; 
     return true; 
    } 
} 

class Test 
{ 
    static void Main() 
    { 
     dynamic x = new NullingExpandoObject(); 
     x.Foo = "Hello"; 
     Console.WriteLine(x.Foo ?? "Default"); // Prints Hello 
     Console.WriteLine(x.Bar ?? "Default"); // Prints Default 
    } 
} 

espero que el verdadero ExpandoObject es bastante más sofisticada que esto, pero si esto es todo lo que necesita ...

+0

gracias Skeetman! – mcintyre321

+1

Volviendo verdadero sin importar el resultado en 'values.TryGetValue' para suprimir el error. ¡Gracias señor por la respuesta! – dpp

+0

Perdón por resucitar esto pero es años más tarde y este código todavía produce dos excepciones de RuntimeBinderException. ¿Hay alguna manera de que podamos hacer que esto funcione sin tener que desencadenar excepciones durante cada acceso? – Anthony

Cuestiones relacionadas