C# 将所选属性复制到其他类型的对象
我需要将一个对象的属性复制到另一个对象,这两个对象可以是不同类型的,也可以具有相同名称的属性。这些属性也可以是复杂类型 我能够为简单的C# 将所选属性复制到其他类型的对象,c#,linq,lambda,C#,Linq,Lambda,我需要将一个对象的属性复制到另一个对象,这两个对象可以是不同类型的,也可以具有相同名称的属性。这些属性也可以是复杂类型 我能够为简单的类型属性实现复制功能,但对于复杂类型我却无法实现。。如下面的示例代码段所示 [TestClass] public class PropAssignTest { [TestMethod] public void Test() { Test1 t1 = new Test1() { Prop1 = "test", TestName
类型
属性实现复制功能,但对于复杂类型我却无法实现。。如下面的示例代码段所示
[TestClass]
public class PropAssignTest
{
[TestMethod]
public void Test()
{
Test1 t1 = new Test1() { Prop1 = "test", TestName = new Test3 { Name = "santosh" } } ;
Test2 t2 = new Test2();
Assign<Test1, Test2>(t1, t2, e => e.Prop1);
Assign<Test1, Test2>(t1, t2, e => e.TestName.Name);//this doesnot work !!
}
private void Assign<T1,T2>(T1 T1Obj, T2 T2Obj, Expression<Func<T1, object>> memberLamda)
{
var memberSelectorExpression = memberLamda.Body as MemberExpression;
if (memberSelectorExpression != null)
{
var property = memberSelectorExpression.Member as PropertyInfo;
if (property != null)
{
T2Obj.GetType().GetProperty(property.Name).SetValue(T2Obj, property.GetValue(T1Obj));
}
}
}
[TestClass]
公共类传播测试
{
[测试方法]
公开无效测试()
{
Test1 t1=newtest1(){Prop1=“test”,TestName=newtest3{Name=“santosh”};
Test2 t2=新的Test2();
赋值(t1,t2,e=>e.Prop1);
赋值(t1,t2,e=>e.TestName.Name);//这不起作用!!
}
私有无效赋值(T1 T1Obj、T2 T2Obj、表达式memberLamda)
{
var memberSelectorExpression=memberLamda.Body作为MemberExpression;
if(memberSelectorExpression!=null)
{
var property=memberSelectorExpression.Member作为PropertyInfo;
if(属性!=null)
{
T2Obj.GetType().GetProperty(property.Name).SetValue(T2Obj,property.GetValue(T1Obj));
}
}
}
在上面的代码中,我想复制e.TestName.Name
,其中TestName
是一个复杂类型的对象,其中我只需要复制TestName
的Name属性,TestName
可以定义许多属性
任何建议
谢谢使用并忽略您不想映射的成员
config.CreateMap<Person, Employee>()
.ForMember(d => d.Name, o => o.MapFrom(s => s.FullName))
.ForMember(d => d.Age, o => o.Ignore());
config.CreateMap()
.ForMember(d=>d.Name,o=>o.MapFrom(s=>s.FullName))
.ForMember(d=>d.Age,o=>o.Ignore());
使用并忽略您不想映射的成员
config.CreateMap<Person, Employee>()
.ForMember(d => d.Name, o => o.MapFrom(s => s.FullName))
.ForMember(d => d.Age, o => o.Ignore());
config.CreateMap()
.ForMember(d=>d.Name,o=>o.MapFrom(s=>s.FullName))
.ForMember(d=>d.Age,o=>o.Ignore());
您可以尝试使用@Kevin提到的AutoMapper。如果您仍然需要自定义方法,可以尝试此方法。注意:它将值复制到目标对象本身的属性,而不会像表达式树中那样查找属性
private static void Assign<T1, T2>(T1 T1Obj, T2 T2Obj, Expression<Func<T1, object>> memberLamda)
{
var memberSelectorExpression = memberLamda.Body as MemberExpression;
if (memberSelectorExpression != null)
{
var sourceProperty = memberSelectorExpression.Member as PropertyInfo;
if (sourceProperty != null)
{
var targetProperty = T2Obj.GetType().GetProperty(sourceProperty.Name);
if (targetProperty != null)
{
targetProperty.SetValue(T2Obj, GetValue(T1Obj, memberSelectorExpression));
}
}
}
}
public static object GetValue<T>(T source, MemberExpression expr)
{
var sourceProperty = expr.Member as PropertyInfo;
var nextExpression = expr.Expression as MemberExpression;
if (nextExpression == null)
{
return sourceProperty.GetValue(source);
}
var sourcePart = GetValue(source, nextExpression);
return sourceProperty.GetValue(sourcePart);
}
私有静态void赋值(T1 T1Obj、T2 T2Obj、表达式memberLamda)
{
var memberSelectorExpression=memberLamda.Body作为MemberExpression;
if(memberSelectorExpression!=null)
{
var sourceProperty=memberSelectorExpression.Member作为PropertyInfo;
if(sourceProperty!=null)
{
var targetProperty=T2Obj.GetType().GetProperty(sourceProperty.Name);
if(targetProperty!=null)
{
SetValue(T2Obj,GetValue(T1Obj,memberSelectorExpression));
}
}
}
}
公共静态对象GetValue(T源,MemberExpression expr)
{
var sourceProperty=expr.Member作为PropertyInfo;
var nextExpression=expr.Expression作为MemberExpression;
if(nextExpression==null)
{
返回sourceProperty.GetValue(源);
}
var sourcePart=GetValue(source,nextExpression);
返回sourceProperty.GetValue(sourcePart);
}
您可以尝试使用@Kevin提到的AutoMapper。如果您仍然需要自定义方法,可以尝试此方法。注意:它将值复制到目标对象本身的属性,而不会像表达式树中那样查找属性
private static void Assign<T1, T2>(T1 T1Obj, T2 T2Obj, Expression<Func<T1, object>> memberLamda)
{
var memberSelectorExpression = memberLamda.Body as MemberExpression;
if (memberSelectorExpression != null)
{
var sourceProperty = memberSelectorExpression.Member as PropertyInfo;
if (sourceProperty != null)
{
var targetProperty = T2Obj.GetType().GetProperty(sourceProperty.Name);
if (targetProperty != null)
{
targetProperty.SetValue(T2Obj, GetValue(T1Obj, memberSelectorExpression));
}
}
}
}
public static object GetValue<T>(T source, MemberExpression expr)
{
var sourceProperty = expr.Member as PropertyInfo;
var nextExpression = expr.Expression as MemberExpression;
if (nextExpression == null)
{
return sourceProperty.GetValue(source);
}
var sourcePart = GetValue(source, nextExpression);
return sourceProperty.GetValue(sourcePart);
}
私有静态void赋值(T1 T1Obj、T2 T2Obj、表达式memberLamda)
{
var memberSelectorExpression=memberLamda.Body作为MemberExpression;
if(memberSelectorExpression!=null)
{
var sourceProperty=memberSelectorExpression.Member作为PropertyInfo;
if(sourceProperty!=null)
{
var targetProperty=T2Obj.GetType().GetProperty(sourceProperty.Name);
if(targetProperty!=null)
{
SetValue(T2Obj,GetValue(T1Obj,memberSelectorExpression));
}
}
}
}
公共静态对象GetValue(T源,MemberExpression expr)
{
var sourceProperty=expr.Member作为PropertyInfo;
var nextExpression=expr.Expression作为MemberExpression;
if(nextExpression==null)
{
返回sourceProperty.GetValue(源);
}
var sourcePart=GetValue(source,nextExpression);
返回sourceProperty.GetValue(sourcePart);
}
只需使用AutoMapper:)不,我不能,一个。因为我只想复制选定的属性,AutoMapper将尝试复制所有属性。@SantoshVaza您可以配置AutoMapper如何将T1映射到T2。也许您需要像Assign这样的方法(T1源、表达式源成员、T2目标、表达式目标成员)?只需使用AutoMapper:)不,我不能,一个。因为我只想复制选定的属性,AutoMapper将尝试复制所有属性。@SantoshVaza您可以配置AutoMapper如何将T1映射到T2。也许您需要像Assign这样的方法(T1源、表达式源成员、T2目标、表达式目标成员)?谢谢@Kevin,但我不想用Automapper谢谢@Kevin,但我不想用Automapper谢谢你的回答,我会试试。targetProperty==null检查对我来说似乎是个小故障,如果T2Obj已经有了同名的属性谢谢你的回答,我会试试。targetProperty==null检查对我来说似乎是个小故障,如果T2Obj已经有了这是一个同名的属性