我有两个相同类的对象说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中的值。 这是可能的。如果是,那么请指导我。
答案 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);
}
}