gpt4 book ai didi

c# - 关于 ComponentModel 和反射

转载 作者:太空狗 更新时间:2023-10-30 00:29:17 30 4
gpt4 key购买 nike

我有一个接受任何对象的函数,然后它从作为输入的属性或字段中获取值。

目前看起来是这样的:

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 类的内容。当性能有问题时,2 个框架(Reflection 和 ComponentModel)之间有什么区别。使用 ComponentModel 重写上面的代码会获得更好的性能或灵 active 吗?据我所知,这两者之间的唯一其他区别是 CM 对虚拟属性的支持。

是的。

最佳答案

不同之处在于 ComponentModel 是对原始类的抽象。这意味着您可以定义不存在的属性 - 事实上,这正是 DataView/DataRowView 将列作为数据属性公开的方式捆绑。使用 ComponentModel,即使在 1.1 中,您也可以获得类似“动态”的东西。

您可能认为这意味着 ComponentModel 速度较慢;但实际上,您可以利用这种抽象来获取 yield ... HyperDescriptor正是这样做的——使用 Reflection.Emit 编写直接 IL 来表示属性,提供比反射或 vanilla ComponentModel 更快的访问。

但是请注意,默认情况下,ComponentModel 仅限于属性(而非字段)。您可以通过即时 PropertyDescriptor 外观来实现,但这不是一个好主意。在 ComponentModel 中也没有太多地方可以放置“只写”属性。

关于c# - 关于 ComponentModel 和反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/824676/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com