2013-02-22 65 views
1

我在一个互操作场景中,因此我正在处理类似结构的结构和类在不同的程序集中使用 - 所以一个演员阵容是不够的,必须手动场地,这是非常无聊和容易出错。Linq查询从对象B获得具有相同名称和类型的对象的属性A

因此,我设计了一个功能,可以复制大量简单的字段/属性,而且我只处理困扰的字段/属性。

当我这样做属性只,它工作正常。但我现在需要如何解决这个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# error: Error 2 The type of one of the expressions in the join clause is incorrect. Type inference failed in the call to 'Join'.

编辑:我看到了价值注入,但它像使用死星杀蚊子... [/编辑]

+1

他们会始终* *是在目标类型的原始类型和属性字段?或者可能会有混合?另外,如果你遵循正常的.NET命名约定,并且使用'camelCase'作为你的局部变量,你的代码将更容易阅读... – 2013-02-26 07:16:31

+0

@JonSkeet:_或者可能有混合?_在创建这个函数中,I涵盖了这两种情况。 _你遵循正常的.NET命名约定_我每天都在三个不同的平台上编程,当我必须从头开始创建代码时,我很努力地传达了最近的惯例。最后,尝试创造的混乱让我选择了一个惯例 - – 2013-02-26 13:05:30

+0

@JonSkeet:(续)我可以不必停下来再调整:pascal对象。上面的代码是我在工作中完成的真实代码的摘录。当我在SO上发布时,我会尝试传达给.NET约定...... – 2013-02-26 13:12:03

回答

3

你的连接语句似乎已创造了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 
     } 
+0

它的工作机会很大。但我只有明天测试它的机会!尼斯。 – 2013-02-25 19:58:37

+0

这是否最终为你工作? – IronMan84 2013-02-26 14:29:42

+1

工作很好! +1,接受。 SO只允许在2小时内奖赏赏金。 – 2013-02-26 15:34:19

相关问题