我有一个函数,它接受任何对象,然后从它作为输入的属性或字段中获取值。
目前的情况如下:
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对虚拟属性的支持。
泰。
发布于 2009-05-05 12:46:53
区别在于ComponentModel是对原始类的抽象。这意味着您可以定义不存在的属性-实际上,这正是DataView / DataRowView将列公开为数据绑定属性的方式。使用ComponentModel,您可以获得类似于“动态”的东西,甚至在1.1中也是如此。
您可能会认为这意味着ComponentModel要慢一些;但是实际上,您可以利用这个抽象来获取.HyperDescriptor正是这样做的--使用Reflection.Emit编写直接IL来表示属性,提供了比反射或普通ComponentModel更快的访问速度。
但是,请注意,默认情况下,ComponentModel仅限于属性(而不是字段)。你可以通过飞行的PropertyDescriptor正面来做,但这不是个好主意.在ComponentModel中也没有太多的“只写”属性。
https://stackoverflow.com/questions/824676
复制相似问题