【问题标题】:c# DynamicObject class dynamic properties from loopc# DynamicObject 类的动态属性来自循环
【发布时间】:2017-09-08 11:46:10
【问题描述】:

所以我创建了一个继承 DynamicObject 的类

public class MyDynamicObject : DynamicObject{
private Dictionary<string, object> Fields = new Dictionary<string, object>();

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
    return Fields.TryGetValue(binder.Name, out result);
}

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

在这里调用这个类

public class Program
{
public static void Main()
{
    dynamic person = new MyDynamicObject();
    person.firstname = "Hello";
    Console.WriteLine(person.firstname);
 }
}  

当然可以。但我需要从像

这样的字符串数组创建属性
string[] fields = new string[]{"taxid","newcol","addrs","gender"};
dynamic person = new MyDynamicObject();
foreach(var f in fields)
{
  person.f = "hello";
}

所以输出将是 person.taxi、person.newcol、person.addrs、person.gender

这可能吗?

【问题讨论】:

  • 看看内置的ExpandoObject;本质上,您必须公开一种向字典添加字段的方法。
  • 我想你的问题可能会在stackoverflow.com/a/4938442/1462295得到回答
  • 关于第一个评论者所说的,为什么不直接用字典来做呢?人[f] =“你好”
  • 我已经使用 ExpandoObject 和它的工作做了它,但我的要求是创建一个具有动态属性并且可以实例化的类,我不知道它是否可能

标签: c# dynamicobject


【解决方案1】:

以某种方式公开Fields 字典,或者(更好)一种允许通过名称显式设置属性的方法。

请注意 ExpandoObject 已经这样做了,因为它可以转换为 IDictionary&lt;string, object&gt; 然后你

ExpandoObject eo = new ExpandoObject();
IDictionary<string, object> dict = eo;
dynamic d = eo;
dict["MyProperty"] = 42;
Console.WriteLine(d.MyProperty); // 42

如果你不能只使用ExpandoObject 本身,你可以复制它的方法。

【讨论】:

    【解决方案2】:

    好的,根据@Jon Hanna 的建议,我想出了一个符合我要求的解决方案。我创建了一个接受名称的新 Add 方法。以下是我使用的更新代码。

    public class DynamicFormData : DynamicObject
    {
        private Dictionary<string, object> Fields = new Dictionary<string, object>();
    
        public int Count { get { return Fields.Keys.Count; } }
    
        public void Add(string name, string val = null)
        {
            if (!Fields.ContainsKey(name))
            {
                Fields.Add(name, val);
            }
            else
            {
                Fields[name] = val;
            }
        }
    
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (Fields.ContainsKey(binder.Name))
            {
                result = Fields[binder.Name];
                return true;
            }
            return base.TryGetMember(binder, out result); 
        }
    
        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            if (!Fields.ContainsKey(binder.Name))
            {
                Fields.Add(binder.Name, value);
            }
            else
            {
                Fields[binder.Name] = value;
            }
            return true;
        }
    
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            if (Fields.ContainsKey(binder.Name) &&
                Fields[binder.Name] is Delegate)
            {
                Delegate del = Fields[binder.Name] as Delegate;
                result = del.DynamicInvoke(args);
                return true;
            }
            return base.TryInvokeMember(binder, args, out result);
        }
    }
    

    那我就这样称呼吧。

    string[] fields = new string[]{"taxid","newcol","addrs","gender"};
    dynamic formData = new DynamicFormData();
    
    foreach(string field in fields)
    {
        formData.Add(field, null);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-17
      • 1970-01-01
      • 2012-12-18
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多