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约定中。。。