c# - 使用反射(或其他方式)获取成员对象

标签 c# reflection

我希望能够通过名称访问类的属性或成员。如果它是一个属性,我很好:

  PropertyInfo prop = object.GetType().GetProperty(propertyName);
  object propValue = prop.GetValue(object, null);

如果它是成员/字段,事情似乎有点棘手。在研究了 GetMember 并尝试了一堆不同的东西之后,我无法弄清楚如何以与从 GetProperty 返回的方式相同的方式获取对对象的引用,如果这是一个属性(property)。

另一个问题是,这是完成此任务的正确方法吗?在阅读反射时,它似乎有很多开销。这只是与不使用反射相比,还是它足够重要以至于我应该三思而后行地开发一些将经常这样做的东西,以及我有什么替代方案(如果有的话)来获得对成员的引用仅按名称分类?

感谢任何见解。如果有任何不同,我的目标是能够序列化任意命名的属性或类的成员。

最佳答案

您可以使用 GetField如果你想检索一个字段,而不是 GetProperty

FieldInfo field = object.GetType().GetField(fieldName);
object fieldValue = field.GetValue(Context.Parent);

or is it significant enough that I should think twice about developing something that will be doing this a lot, and what alternatives do I have, if any, to obtain a reference to a member of a class by name only?

这绝对是昂贵的,但我会分析它以确定您是否会遇到性能问题。

另一个主要选择是自己构建某种形式的字典,将“名称”映射到值。这可以是映射到值的直接字典,也可以是映射到检索值的委托(delegate)的字典。这样做的好处是您可以使它以相同的方式用于属性或字段,但每个类都需要创建映射。 (然而,这可以通过在构建时进行反射(reflection)来完成。)

If it makes any difference, my goal is to be able to serialize an arbitrary named property or member of a class.

我建议查看内置的 Serialization Support在推出你自己的版本之前......

关于c# - 使用反射(或其他方式)获取成员对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5122201/

相关文章:

java - 获取Java中所有公共(public)变量的名称和值(包括继承对象的)

c# - 尝试通过 .NET REST API 进行 POST

c# - Oracle 架构名称

c# - 使用自定义的覆盖默认的 ClickOnce 初始屏幕

c# - 将 JSON 字符串反序列化为 .NET 对象时反射太慢

.net - 如何判断某个字段是否是自动实现的属性的支持字段?

java - 使用 forName 通过 main 检索测试模块中的类

c# - 当代码有错误时,Visual Studio 2012 Ultimate IntelliSense 无法正常工作

c# - WPF MVVM 防止选项卡更改

c# - 如何在 C# 上运行时执行一次方法