我有一个接受任何对象的函数,然后它从它作为输入的属性或字段中获取值.
它目前看起来像这样:
private string GetFieldValue(object o, Field f) { //field.name is name of property or field MemberInfo[] mi = o.GetType().GetMember(field.name, MemberTypes.Field | MemberTypes.Property, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.ExactBinding ); if (mi.Length == 0) throw new ArgumentException("Field", "Can't find member: " + f.name); Object value; if (mi[0].MemberType == MemberTypes.Property) value = ((PropertyInfo)mi[0]).GetValue(o, null); else value = ((FieldInfo)mi[0]).GetValue(o);
今天我读到了System.ComponentModel及其XXXDescriptor类.当性能存在问题时,两个框架(Reflection和ComponentModel)之间有什么区别.将使用ComponentModel重写上面的内容会实现更好的性能还是灵活性?我知道这两者之间唯一的另一个区别是CM支持虚拟属性.
TY.
不同之处在于ComponentModel是对原始类的抽象.这意味着您可以定义不存在的属性- 实际上,这正是DataView
/ 如何DataRowView
将列作为数据绑定的属性公开.使用ComponentModel,你甚至可以在1.1中获得类似"动态"的东西.
您可能认为这意味着ComponentModel更慢; 但实际上,你可以利用这个抽象来获取... HyperDescriptor正是这样做 - 使用Reflection.Emit
直接IL来表示属性,比反射或vanilla ComponentModel提供更快的访问速度.
但请注意,默认情况下,ComponentModel仅限于属性(不是字段).你可以通过即时PropertyDescriptor
外观来做到这一点,但这不是一个好主意.ComponentModel中的"只写"属性也没有多少位置.