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

C# Linq查询以从对象B获取与对象A具有相同名称和类型的属性,c#,.net,linq,reflection,C#,.net,Linq,Reflection,我使用的是互操作场景,正因为如此,我处理的结构和类就像不同程序集中的结构一样使用-因此,强制转换是不够的,必须逐个字段手动执行,这非常枯燥且容易出错 因此,我设计了一个函数,它复制了大量简单的字段/属性,而我只处理有问题的字段/属性 当我只对属性执行此操作时,它工作正常。但是我现在需要如何修复这个LiNQ查询,以便能够从源对象获取字段列表,并将它们与目标对象上的属性连接起来 代码如下: var TypeOrig = pSource.GetType(); var TypeDest

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

因此,我设计了一个函数,它复制了大量简单的字段/属性,而我只处理有问题的字段/属性

当我只对属性执行此操作时,它工作正常。但是我现在需要如何修复这个
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子句中某个表达式的类型不正确。调用“Join”时类型推断失败。


编辑:我看到了ValueInjector,但这就像用死星杀死蚊子一样…[/EDIT]

我想你可能在找AutoMapper。或值注入器

值注入器示例:

myObject.InjectFrom(anyOtherObject);

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

//inject using your own injection
a.InjectFrom<MyInjection>(b);
myObject.InjectFrom(任何其他对象);
//从多个来源注入
a、 从(b,c,d,e)开始;
//用你自己的注射剂注射
a、 从(b)开始;

我想你可能在找AutoMapper。或值注入器

值注入器示例:

myObject.InjectFrom(anyOtherObject);

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

//inject using your own injection
a.InjectFrom<MyInjection>(b);
myObject.InjectFrom(任何其他对象);
//从多个来源注入
a、 从(b,c,d,e)开始;
//用你自己的注射剂注射
a、 从(b)开始;

您的join语句似乎正在创建两种不同的匿名类型,因为其中一种具有名为
FieldType
的属性,另一种具有名为
PropertyType
的属性。LINQ无法执行联接,除非两种类型的字段顺序完全相同。这方面有一篇精彩的文章

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

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

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

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

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

这很有可能奏效。但我明天才有机会测试!!很好,做得很好+1、接受。因此,只允许在2小时内奖励赏金。赏金必须得到奖励。赏金发挥作用的机会很大。但我明天才有机会测试!!很好,做得很好+1、接受。因此,只允许在2小时内奖励赏金。赏金必须得到奖励。它们将始终是原始类型的字段和目标类型的属性吗?或者可能有一种混合物?此外,如果您遵循正常的.NET命名约定,并对局部变量使用
camelCase
,那么您的代码将更易于阅读…@JonSkeet:或者可能存在混合?在创建此函数时,我将介绍另外两种情况。你会遵循正常的.NET命名约定-我每天在三个不同的平台上编程,当我不得不从头开始创建代码时,我在最近的过去非常努力地传达这些约定。最后,尝试造成的混乱让我选择了一个惯例——一个that@JonSkeet:(续)我不需要停下来再次调整就可以传达:object pascal。上面的代码是我在工作中完成的真实代码的摘录。当我在上发布时,我将尝试传递到.NET约定,因此…它们将始终是原始类型中的字段和目标类型中的属性吗?或者可能有一种混合物?此外,如果您遵循正常的.NET命名约定,并对局部变量使用
camelCase
,那么您的代码将更易于阅读…@JonSkeet:或者可能存在混合?在创建此函数时,我将介绍另外两种情况。你会遵循正常的.NET命名约定-我每天在三个不同的平台上编程,当我不得不从头开始创建代码时,我在最近的过去非常努力地传达这些约定。最后,尝试造成的混乱让我选择了一个惯例——一个that@JonSkeet:(续)我不需要停下来再次调整就可以传达:object pascal。上面的代码是我在工作中完成的真实代码的摘录。当我在上发布时,我将尝试传达到.NET约定中。。。