.net4.0 dynamic问题,属性名在一个变量中,该怎么操作呢??
想用dynamic代替反射,遇到如下问题
比如:
var a="abcd";
dynamic b=new object();
b.a="test" //我希望这个a是一个变量,值就是上面的"abcd"
可以吗?
[解决办法]
- C# code
static void Main(string[] args) { dynamic d = new MyDynamicObject(); d.ojlovecd = "ojlovecd"; Console.WriteLine(d.ojlovecd); } class MyDynamicObject : System.Dynamic.DynamicObject { private Dictionary<string, object> dic = new Dictionary<string, object>(); public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result) { return dic.TryGetValue(binder.Name, out result) || base.TryGetMember(binder, out result); } public override bool TrySetMember(System.Dynamic.SetMemberBinder binder, object value) { if (dic.ContainsKey(binder.Name)) dic[binder.Name] = value; else dic.Add(binder.Name, value); base.TrySetMember(binder, value); return true; } }
[解决办法]
- C# code
static void Main(string[] args) { dynamic d = new MyDynamicObject(); d.ManuallySetMember("Name", "ojlovecd"); Console.WriteLine(d.Name); } class MyDynamicObject : System.Dynamic.DynamicObject { private Dictionary<string, object> dic = new Dictionary<string, object>(); public override bool TryGetMember(System.Dynamic.GetMemberBinder binder, out object result) { return dic.TryGetValue(binder.Name, out result) || base.TryGetMember(binder, out result); } public override bool TrySetMember(System.Dynamic.SetMemberBinder binder, object value) { if (dic.ContainsKey(binder.Name)) dic[binder.Name] = value; else dic.Add(binder.Name, value); base.TrySetMember(binder, value); return true; } public void ManuallySetMember(string key, object value) { if (dic.ContainsKey(key)) dic[key] = value; else dic.Add(key, value); } }
[解决办法]
直接用 ExpendoObject 也可以。
- C# code
dynamic person = new ExpandoObject();var dict = (IDictionary<String, Object>)person;dict.Add("abcd", "test");Console.WriteLine(person.abcd);
[解决办法]
[解决办法]
[解决办法]
看来看去,lz的场景只是一般的反射赋值。。。。
[解决办法]
dynamic性能太低了,,,我以前做过一个很简单的小例子,一个dynamic方法和一个普通的方法,性能相差20倍。
------解决方案--------------------
[解决办法]
[解决办法]
都写到这份上了还不明白,那我也没辙了……
[解决办法]
如果这里 User 已经是定义好的强类型,就别用dynamic了。
[解决办法]
[解决办法]
我了解楼主的意思,dynamic在我的代码中常用,但并不能解决属性名不确定的问题,
如果属性名在编码阶段不确定,只能用反射实现。
[解决办法]
[解决办法]
还是设计问题,用Dictionary肯定可以实现你想要的那种动态属性的概念,关键是你要改变思维,别用属性,既然是动态的,为什么设计的时候又要定义成属性这种静态的概念呢?
一个班好多学生,你定义一个班级,用每个学生的学号当作一个属性,然后用的时候动态得到学号,去反射出学生,这样多麻烦?为什么不直接用一个字典,用学号当键,访问多方便
或者说一个汽车四个轮胎,你不知道访问那个轮胎,定义的时候用 左前 左后 右前 右后 四个属性,然后去反射属性,都是一个概念,用字典,四个轮子放在一个集合里,多方便
[解决办法]
我的理解,不能用dynamic代替反射的吧
dynamic是你开发的时候已知它具有的属性或方法,但编译器不知道,你直接写属性方法,让编译器不要出错。
反射是用字符串代替具体的方法,是你运行的时候才知道它的方法属性,比动态还要延后。
如果你不是写orm,而是自己给自己的数据库编程,才可能用的是dynamic吧