将对象a的值复制到对象b而不会干扰c#中的非空值

时间:2015-12-22 16:59:54

标签: c# object

我有两个相同类的对象说Obj1和Obj2,如果相同的类.Obj1包含一些值,其他的相同。 例如

class book 
{
   public string science {get;set;} 
   public string math {get;set;}
   public string drawing {get;set;}
   public string english {get;set;}
}

Obj1包含绘画,数学和科学价值 Obj2包含数学和英语值。

我想将Obj1复制到Obj2,使Obj2得到绘图,科学值,并在Obj1中用值替换数学值,并保留Obj2的英文值。

这只是示例实际项目在类中包含60多个属性所以我不想做像Obj2.drawing = Obj1.drawing,Obj2.math = Obj1.math而且很快。我需要这样做而不提及属性名称,如math,drawing ....

总之,我需要将Obj1的值复制到Obj2,并且只有Obj1中的那些值在Obj2中被替换,Obj1的null值不应该替换Obj2中的值。 这是可能的。如果是,那么请指导我。

4 个答案:

答案 0 :(得分:3)

AutoMapper到resque!

Mapper.CreateMap<Book, Book>()
    .ForAllMembers(opt => opt.Condition(srs => !srs.IsSourceValueNull));

var b1 = new Book { P1 = null, P2 = "b1p2" };
var b2 = new Book { P1 = "b2p1", P2 = "b2p2" };

Mapper.Map(b1, b2);

Assert.IsNotNull(b2.P1);

答案 1 :(得分:2)

您可以使用基于实例的复制函数,在分配值之前检查null:

public class book
{
    public string science { get; set; }
    public string math { get; set; }
    public string drawing { get; set; }
    public string english { get; set; }

    public book()
    {
    }

    public void CopyTo(book other)
    {
        if (!string.IsNullOrEmpty(this.science))
            other.science = this.science;

        if (!string.IsNullOrEmpty(this.math))
            other.math = this.math;

        if (!string.IsNullOrEmpty(this.drawing))
            other.drawing = this.drawing;

        if (!string.IsNullOrEmpty(this.english))
            other.english = this.english;
    }
}

示例:

var foo = new book();
foo.science = "foo1";
foo.math = "foo2";
foo.drawing = "foo3";
foo.english = null;

var bar = new book();
bar.science = "bar1";
bar.math = "bar2";
bar.drawing = "bar3";
bar.english = "bar4";

foo.CopyTo(bar);

Console.WriteLine(bar.science);
Console.WriteLine(bar.math);
Console.WriteLine(bar.drawing);
Console.WriteLine(bar.english);

Console.Read();

这将确保属性null的{​​{1}}值不会复制到foo.english obj的关联属性。

给出输出:

  

foo1   foo2的   foo3   bar4

答案 2 :(得分:1)

您可以改用词典。它有这些方法:

Add(String key, String value)
TryGetValue(String key, out String value)

你也可以像数组一样使用它们,只需在方括号中放一个字符串。

String x = dictionary["x"];

您可能想要做的一个例子:

var books = new Dictionary<String, String>();
books.Add("Science", "Sciencey stuff goes in here!");
books.Add("English", "How now brown cow");
Console.WriteLine(books["English"]);

// Now lets assume you want to add one set of books to another
foreach(KeyValuePair<String, String> book in books1)
    if (!books2.ContainsKey(book.Key))
        books2.Add(book.Key, book.Value);

答案 3 :(得分:1)

您可以使用System.Reflection。但它很慢,比obj2.drawing = obj1.drawing慢得多。这是代码:

    public static void CopyNotNulls<T>(T source, T dest)
    {
        var type = typeof(T);
        var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance)
            .Where(p => p.PropertyType.IsClass)
            .ToArray();
        foreach (var property in properties)
        {
            var val = property.GetValue(source);
            if (val == null)
            {
                continue;
            }
            property.SetValue(dest, val);
        }
    }