c#DynamicObject类来自循环的动态属性(c# DynamicObject class dynamic properties from loop)

编程入门 行业动态 更新时间:2024-10-16 22:18:38
c#DynamicObject类来自循环的动态属性(c# DynamicObject class dynamic properties from loop)

所以我创建了一个继承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

这可能吗?

So I've created a class that inherits 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; } }

And call this class here

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

Of course this will work. But I need to create properties from a string array like

string[] fields = new string[]{"taxid","newcol","addrs","gender"}; dynamic person = new MyDynamicObject(); foreach(var f in fields) { person.f = "hello"; }

So the output will be person.taxi, person.newcol, person.addrs, person.gender

Is this possible?

最满意答案

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

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

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

如果您不能只使用ExpandoObject本身,则可以复制其方法。

Okay so based on the suggestion of @Jon Hanna, I came up with a solution that fits my requirements. I created a new Add method which accept a name. Below is the updated code I used.

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

Then I just call it like this.

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

更多推荐

本文发布于:2023-07-22 09:48:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1219117.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:属性   动态   DynamicObject   class   loop

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!