2011-06-09 20 views
18

aşağıdaki gibi bir şey yapabilmek istiyorum:.net DynamicObject uygulaması

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

ama bu

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

mi atıyor Eksik tanımlamalar için null döndürecek DynamicObject veya bir tane nasıl oluşturulacağı ile ilgili bir öğretinin nasıl uygulanacağını biliyor musunuz? Çok teşekkürler!

cevap

30

Böyle bir şey mi var?

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 
    } 
} 

Gerçek ExpandoObject bu ziyade daha sofistike bekliyoruz, ancak bu tek ihtiyacınız ...

+0

sayesinde Skeetman ise! – mcintyre321

+1

Doğrusu döndürme, sonucun "values.TryGetValue" ifadesinde ne olursa olsun hatayı bastırmasıdır. Cevabınız için teşekkürler efendim! – dpp

+0

Bunu yeniden direttiğim için üzgünüm ama yıllar sonra bu kod hala iki RuntimeBinderException istisnası üretiyor. Her erişim sırasında istisnaları tetiklemeden bu işi yapabileceğimiz bir yol var mı? – Anthony

İlgili konular