1

我处于互操作场景中,因此我正在处理在不同程序集中使用的结构和类,因此转换是不够的,必须逐个字段手动进行,这非常无聊且容易出错.

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

当我仅对属性执行此操作时,它可以正常工作。但是我现在需要如何修复此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'.

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

4

2 回答 2

3

您的 join 语句似乎正在创建 2 种不同的匿名类型,因为一种具有名为的属性FieldType,另一种具有名为 的属性PropertyType。LINQ 无法进行连接,除非两种类型具有完全相同的字段且顺序完全相同。在这里找到了一篇很棒的文章。

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

join PDest in PropDest
        on new
        {
            Name = POrig.Name,
            JoinType = POrig.FieldType
        } equals new
        {
            Name = PDest.Name,
            JoinType = PDest.PropertyType
        }
于 2013-02-25T18:57:03.757 回答
1

我想你可能会在 AutoMapper 之后。http://automapper.codeplex.com/或值注入器http://valueinjecter.codeplex.com/

值注入器示例:

myObject.InjectFrom(anyOtherObject);

//inject from multiple sources
a.InjectFrom(b,c,d,e);

//inject using your own injection
a.InjectFrom<MyInjection>(b);
于 2013-02-22T23:33:53.030 回答