2011-06-09 61 views

回答

30

是这样的?

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

我希望真正的ExpandoObject是相当比这更复杂,但如果这是你所需要的...

+0

感谢Skeetman! – mcintyre321 2011-06-09 11:35:52

+1

无论'values.TryGetValue'中的结果是什么,都可以返回true来抑制错误。谢谢你的答案! – dpp 2013-06-18 10:58:57

+0

不好意思复活这个,但几年后,这段代码仍然会产生两个RuntimeBinderException异常。有没有什么办法可以让这项工作在每次访问期间都不会触发异常? – Anthony 2015-08-14 20:52:33