【问题标题】:Easiest way to dynamically get/set properties of c# objects by name按名称动态获取/设置 c# 对象属性的最简单方法
【发布时间】:2016-02-16 07:34:27
【问题描述】:

我有几个不同类型的对象以及我需要在这些对象上获取和设置的属性的名称。在像 javascript 这样的语言中,这很简单,因为我可以使用索引器语法获取和设置值。

obj2[propertyName] = obj1[propertyName];

在 c# 中,这并不容易。我知道我可以使用反射,但这是很多代码。我知道有动态对象,但它们不会自动按名称引用属性。在任意类型的对象上按名称动态获取和设置属性的最简单方法是什么(即它们具有属性但并不都共享一个公共接口或基类)?

更新:经过进一步研究,如果有人有任何想法,FastMember、Impromptu、Dynamitey 或 FSharp.Dynamic 似乎可以提供帮助......

【问题讨论】:

  • @Eser 我知道 Automapper 并在我的项目的其他地方使用它,但在这种情况下,我需要动态获取属性,根据结果做出决定,然后设置它们。这是一个不同的用例。

标签: c# dynamic reflection


【解决方案1】:

冒着过度简化解决方案的风险,为什么不创建一对抽象反射代码的对象类型的扩展方法呢?方法如

static void SetProperty<T>(this object, string propertyName, T propertyValue) 
static T GetProperty<T>(this object, string propertyName)

用法与您的问题描述的不太一样:

obj2.SetProperty("ArbitraryPropertyName", obj1.GetProperty("AribraryPropertyName");

【讨论】:

  • 嗯,是的……但这与反射有何根本不同?显然我不会每次都复制反射代码,我会将它抽象为类似的东西。我的问题是最简单的方法是什么?这不是一个罕见的用例,难道动态对象或 c# 的其他机制不提供更现代的方法吗?
  • 由于我没有直接的答案,我只是推测。但在我看来,由于我们正在处理强类型编译代码,编译器需要支持您建议的那种语法。也就是说,我认为它不存在于 C# 中。我执行您描述的任务的唯一方法是使用反射。由于这里肯定会有几十个问题,特别是如何通过反射获取和设置属性,我想你并没有具体问如何使用反射。
  • 我很感激;由于这会进一步讨论而不是直接回答,因此它的正确位置应在评论部分。
  • 至于强类型代码......是与否,DLR 绝对是部分用于这些情况的东西。我在想应该有一些类似于var foo = new DynamicAccessors(obj); foo["Prop"] = 123 的东西,我只是不知道正确的语法。
【解决方案2】:

属性对象中的动态值:

public dynamic propertyName {
   get; set;
}

要通过名称获取属性,您需要在类中实现索引器 https://www.geeksforgeeks.org/c-sharp-indexers/

【讨论】:

  • 欢迎来到stackoverflow,感谢您的加入。不幸的是,这不是答案,因为它没有演示如何通过属性名称获取和设置事物,只是有一个动态类型。除了都使用方括号之外,索引器属性与此无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 2013-12-23
  • 2021-10-08
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多