所以我创建了一个继承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); }更多推荐
发布评论