Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将所选属性复制到其他类型的对象_C#_Linq_Lambda - Fatal编程技术网

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已经有了这是一个同名的属性