gpt4 book ai didi

c# - 如何编写支持对象初始值设定项的自定义 DynamicObject 类

转载 作者:行者123 更新时间:2023-11-30 15:06:01 34 4
gpt4 key购买 nike

DynamicObject 的文档中,有一个 DynamicDictionary 的示例,它允许您像使用具有属性的类一样使用字典。

这是类(为简洁起见略作修改):

public class DynamicDictionary : DynamicObject
{
Dictionary<string, object> _dictionary = new Dictionary<string, object>();

public int Count
{
get { return _dictionary.Count; }
}

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
string name = binder.Name.ToLower();
return _dictionary.TryGetValue(name, out result);
}

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

我想做的是修改类,以便我可以执行以下操作:

public class Test
{
public Test()
{
var result = Enumerable.Range(1, 5).Select(i => new DynamicDictionary
{
Id = i,
Foo = "Foo",
Bar = 2
});
}
}

问题

  1. 这可能吗?
  2. 如果是,怎么做?

最佳答案

DynamicObject 提供 TryCreateInstance() ,它适用于这种情况,但不能在 C# 中使用。

我看到了一些解决方法:

  1. 创建动态工厂类。当您使用命名参数调用其 Create() 方法时,它会将其传递给字典:

    class DynamicDictionaryFactory : DynamicObject
    {
    public override bool TryInvokeMember(
    InvokeMemberBinder binder, object[] args, out object result)
    {
    if (binder.Name == "Create")
    {
    // use binder.CallInfo.ArgumentNames and args
    // to create the dynamic dictionary
    result = …;
    return true;
    }

    return base.TryInvokeMember(binder, args, out result);
    }
    }



    dynamic factory = new DynamicDictionaryFactory();

    dynamic dict = factory.Create(Id: 42);
  2. 使用非动态集合初始值设定项。这意味着在代码中将属性名称作为字符串:

    // has to implement IEnumerable, so that collection initializer works
    class DynamicDictionary
    : DynamicObject, IEnumerable<KeyValuePair<string, object>>
    {
    public void Add(string name, object value)
    {
    m_dictionary.Add(name, value);
    }

    // IEnumerable implmentation and actual DynamicDictionary code here
    }



    dynamic dict = new DynamicDictionary { { "Id", 42 } };
  3. 可能最接近您要求的是使用嵌套 对象初始值设定项。也就是说,该类将具有一个动态属性(例如,Values),其属性可以使用对象初始值设定项进行设置:

    class DynamicDictionary : DynamicObject
    {
    private readonly IDictionary<string, object> m_expandoObject =
    new ExpandoObject();

    public dynamic Values
    {
    get { return m_expandoObject; }
    }

    // DynamicDictionary implementation that uses m_expandoObject here
    }



    dynamic dict = new DynamicDictionary { Values = { Id = 42 } };

关于c# - 如何编写支持对象初始值设定项的自定义 DynamicObject 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8408403/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com