我希望能够做类似以下的事情:
dynamic a = new ExpandoObject();
Console.WriteLine(a.SomeProperty ?? "No such member");
Run Code Online (Sandbox Code Playgroud)
但那会抛出
RunTimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'Throw'
Run Code Online (Sandbox Code Playgroud)
您是否知道DynamicObject的实现将为缺少的定义返回null,或者有关如何创建一个的教程?非常感谢!
Jon*_*eet 34
像这样的东西?
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
}
}
Run Code Online (Sandbox Code Playgroud)
我希望真实ExpandoObject比这更复杂,但如果这就是你所需要的......