是这样的?
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
是相当比这更复杂,但如果这是你所需要的...
感谢Skeetman! – mcintyre321 2011-06-09 11:35:52
无论'values.TryGetValue'中的结果是什么,都可以返回true来抑制错误。谢谢你的答案! – dpp 2013-06-18 10:58:57
不好意思复活这个,但几年后,这段代码仍然会产生两个RuntimeBinderException异常。有没有什么办法可以让这项工作在每次访问期间都不会触发异常? – Anthony 2015-08-14 20:52:33