Tag: 映射

使用Intellisense和编译时检查提取reflection的属性名称

好。 所以我有一些代码将winForm上的某些控件映射到对象中的某些属性,以便在数据发生某些事情时对控件执行某些操作。 一切都很好,工作得很好。 不是问题。 问题是,要将项添加到映射中,我调用的函数看起来像: this.AddMapping(this.myControl,myObject,”myObjectPropertyName”); 我遇到的问题是,在编译时很难说出上述行与下面的行之间的区别: this.AddMapping(this.myControl,myObject,”myObjectPropretyName”); 由于最后一个参数是一个字符串,因此没有编译时检查或类似的任何操作会强制字符串本身实际上对应于给定对象上的有效属性名称。 此外,Refactor和“查找所有引用”之类的内容错过了这种引用,当属性名称发生变化时会导致欢闹。 所以我想知道的是,如果有一些方法可以更改函数,那么我传入的内容仍然是以某种方式表示属性名称的字符串,但是编译时会检查实际值是否进入。有人说我可以用表达式树做到这一点,但我已经阅读了它们,似乎没有看到连接。 我喜欢做类似的事情: this.AddMapping(this.myControl,myObject,myObject.myObjectPropertyName); 甚至 this.AddMapping(this.myControl,myObject.myObjectPropertyName); 会很甜蜜! 有任何想法吗?

C# – 将属性值从一个实例复制到另一个实例,不同的类

我有两个C#类,它们具有许多相同的属性(按名称和类型)。 我希望能够将Defect实例中的所有非空值复制到DefectViewModel的实例中。 我希望用reflection来做,使用GetType().GetProperties() 。 我尝试了以下方法: var defect = new Defect(); var defectViewModel = new DefectViewModel(); PropertyInfo[] defectProperties = defect.GetType().GetProperties(); IEnumerable viewModelPropertyNames = defectViewModel.GetType().GetProperties().Select(property => property.Name); IEnumerable propertiesToCopy = defectProperties.Where(defectProperty => viewModelPropertyNames.Contains(defectProperty.Name) ); foreach (PropertyInfo defectProperty in propertiesToCopy) { var defectValue = defectProperty.GetValue(defect, null) as string; if (null == defectValue) { continue; } // “System.Reflection.TargetException: Object […]