c# - Linq 查询从对象 B 中获取与对象 A 具有相同名称和类型的属性

标签 c# .net linq reflection

我在互操作场景中,正因为如此,我正在处理结构和类,这些结构和类在不同的程序集中使用,就像结构一样——所以强制转换是不够的,必须逐个字段地手动执行,这非常无聊并且容易出错。

所以我设计了一个函数来复制大量简单的字段/属性,我只处理有问题的。

当我只对属性执行此操作时,它工作正常。但我现在需要如何修复此 LiNQ 查询,以便能够从源对象中获取字段列表并将它们与目标对象的属性相结合。

代码如下:

    var TypeOrig = pSource.GetType();
    var TypeDest = pTarget.GetType();
    var TypeString = typeof(System.String);

    var PropOrig = TipoOrig.GetFields(); // if it is GetProperties instead 
                                         // of GetFields works OK
    var PropDest = TipoDest.GetProperties();

    var QryPropVT =
      from
        POrig in PropOrig
      join PDest in PropDest
        on new
        {
            POrig.Name,
            POrig.FieldType
        } equals new
        {
            PDest.Name,
            PDest.PropertyType
        }
      where POrig.PropertyType.IsValueType || (POrig.PropertyType.Equals(TipoString))
      select new
      {
          PropO = POrig,
          PropD = PDest
      };

Visual C# 错误:错误 2 连接子句中的一个表达式的类型不正确。调用“Join”时类型推断失败。

编辑:我看到了值注入(inject)器,但这就像用死星杀死蚊子一样......[/编辑]

最佳答案

您的连接语句似乎正在创建 2 种不同的匿名类型,因为一种具有名为 FieldType 的属性,而另一种具有名为 PropertyType 的属性。 LINQ 无法执行连接,除非这两种类型具有完全相同的字段且顺序完全相同。关于这个有一篇精彩的文章found here .

在这种情况下,您需要为加入执行此操作:

join PDest in PropDest
        on new
        {
            Name = POrig.Name,
            JoinType = POrig.FieldType
        } equals new
        {
            Name = PDest.Name,
            JoinType = PDest.PropertyType
        }

关于c# - Linq 查询从对象 B 中获取与对象 A 具有相同名称和类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034990/

相关文章:

c# - 林克。从多个表中选择

c# - 无法在 COM 可见类库 C# 中加载文件或程序集

c# - 将 C# 表达式与 ADO.NET 数据表相结合

.net - 禁用 SSL 回退并仅将 TLS 用于 .NET 中的出站连接? ( Poodle 缓解)

c# - 使用 LINQ 到具有集合属性的实体的最佳方式

linq - 如何在 LINQ 中设置自动增量 value=true

c# - 如何在运行时引用mvc中的程序集

c# - MongoDb C# 驱动程序在一个原子操作中更新多个文档

.net - WMI 类的原始值

c# - 将列表作为 XElement 传递以用作 XML 数据类型参数