对象属性之间的相互赋值
(一)前言
當(dāng)不同命名空間下的兩個(gè)類(lèi)具有相同的屬性,并且需要進(jìn)行相互賦值時(shí),如下圖中的Jasen.Core.Info類(lèi)的實(shí)例與Jasen.Core.Test.Info類(lèi)的實(shí)例需要相互賦值時(shí),按照一般的思路直接賦值就可以了。通常,這種情況在調(diào)用Web Service的時(shí)候比較常見(jiàn)。當(dāng)需要轉(zhuǎn)換的類(lèi)很多時(shí),亦或者需要轉(zhuǎn)換的屬性很多時(shí),我們就需要根據(jù)一定的規(guī)則來(lái)對(duì)這種場(chǎng)景來(lái)進(jìn)行設(shè)計(jì)了,誰(shuí)也不會(huì)傻布拉吉的一個(gè)一個(gè)屬性的去給對(duì)象賦值。
?
?
?(二)ObjectMapper?類(lèi)負(fù)責(zé)對(duì)象之間相對(duì)應(yīng)的屬性間的賦值
?1?///?<summary>?2?????///?
?3?????///?</summary>
?4?????public?class?ObjectMapper??
?5?????{
?6?????????///?<summary>
?7?????????///?
?8?????????///?</summary>
?9?????????///?<param?name="sourceType"></param>
10?????????///?<param?name="targetType"></param>
11?????????///?<returns></returns>
12?????????public?static?IList<PropertyMapper>?GetMapperProperties(Type?sourceType,?Type?targetType)
13?????????{
14?????????????var?sourceProperties?=?sourceType.GetProperties();
15?????????????var?targetProperties?=?targetType.GetProperties();
16?
17?????????????return?(from?s?in?sourceProperties
18?????????????????????from?t?in?targetProperties
19?????????????????????where?s.Name?==?t.Name?&&?s.CanRead?&&?t.CanWrite?&&?s.PropertyType?==?t.PropertyType
20?????????????????????select?new?PropertyMapper
21???????????????????????????????{
22???????????????????????????????????SourceProperty?=?s,
23???????????????????????????????????TargetProperty?=?t
24???????????????????????????????}).ToList();
25?????????}???????
26?
27?????????///?<summary>
28?????????///?
29?????????///?</summary>
30?????????///?<param?name="source"></param>
31?????????///?<param?name="target"></param>
32?????????public?static?void?CopyProperties(object?source,?object?target)
33?????????{
34?????????????var?sourceType?=?source.GetType();
35?????????????var?targetType?=?target.GetType();
36?????????????var?mapperProperties?=?GetMapperProperties(sourceType,?targetType);
37?
38?????????????for?(int?index?=?0,count=mapperProperties.Count;?index?<?count;?index++)
39?????????????{
40?????????????????var?property?=?mapperProperties[index];
41?????????????????var?sourceValue?=?property.SourceProperty.GetValue(source,?null);
42?????????????????property.TargetProperty.SetValue(target,?sourceValue,?null);
43?????????????}
44?????????}
45?????}
?
public?static?void?CopyProperties(object?source,?object?target)方法將源對(duì)象的屬性值賦給目標(biāo)對(duì)象的屬性。其中必須滿(mǎn)足以下條件:s.Name?==?t.Name?&&?s.CanRead?&&?t.CanWrite?&&?s.PropertyType?==?t.PropertyType,也就是兩個(gè)對(duì)象之間賦值的屬性名,屬性類(lèi)型必須相同,而且源對(duì)象的屬性必須可讀,目標(biāo)對(duì)象的屬性可寫(xiě)。
?
public?static?IList<PropertyMapper>?GetMapperProperties(Type?sourceType,?Type?targetType)方法通過(guò)LINQ將源對(duì)象和目標(biāo)對(duì)象相對(duì)應(yīng)的屬性對(duì)放置在List<PropertyMapper>集合中,每一個(gè)PropertyMapper對(duì)應(yīng)一個(gè)SourceProperty和TargetProperty。PropertyMapper類(lèi)如下:
?1?///?<summary>?2?????///?
?3?????///?</summary>
?4?????public?class?PropertyMapper
?5?????{
?6?????????///?<summary>
?7?????????///?
?8?????????///?</summary>
?9?????????public?PropertyInfo?SourceProperty
10?????????{
11?????????????get;
12?????????????set;
13?????????}
14?
15?????????///?<summary>
16?????????///?
17?????????///?</summary>
18?????????public?PropertyInfo?TargetProperty
19?????????{
20?????????????get;
21?????????????set;
22?????????}
23?????}
?
最后循環(huán)來(lái)遍歷List<PropertyMapper>集合,通過(guò)反射進(jìn)行賦值,主要代碼如下:
???????????????? for?(int?index?=?0,count=mapperProperties.Count;?index?<?count;?index++)
39?????????????{
40?????????????????var?property?=?mapperProperties[index];
41?????????????????var?sourceValue?=?property.SourceProperty.GetValue(source,?null);
42?????????????????property.TargetProperty.SetValue(target,?sourceValue,?null);
43?????????????}
?(三)單元測(cè)試
?1???????? [TestMethod()]?2?????????public?void?CopyPropertiesTest()
?3?????????{
?4?????????????Jasen.Core.Info?source?=?new?Jasen.Core.Info()
?5?????????????{
?6?????????????????Name?=?"jasen",
?7?????????????????CreateTime?=?"2011-3-31".AsDateTime(),
?8?????????????????Exist?=?true,
?9?????????????????ConflictOption?=?ConflictOption.OverwriteChanges
10?????????????};
11?????????????Info?target?=?new?Info();??
12?????????????ObjectMapper.CopyProperties(source,?target);
13?
14?????????????Assert.AreEqual(source.ConflictOption,target.ConflictOption);
15?????????????Assert.AreEqual(source.CreateTime,?target.CreateTime);
16?????????????Assert.AreEqual(source.Exist,?target.Exist);
17?????????????Assert.AreEqual(source.Name,?target.Name);
18?????????}
?
(四)其他
當(dāng)然,當(dāng)需要轉(zhuǎn)換的對(duì)象很多時(shí),可以采用字典Dictionary來(lái)提高性能,Dictionary主要用來(lái)保存對(duì)象對(duì)應(yīng)屬性間的List<PropertyMapper>關(guān)系,當(dāng)下次再次調(diào)用時(shí)候就不需要再次獲取對(duì)象對(duì)應(yīng)屬性間的List<PropertyMapper>關(guān)系了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/jasenkin/archive/2011/03/31/copy_object_property_value_to_other_object_property.html
總結(jié)
以上是生活随笔為你收集整理的对象属性之间的相互赋值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ Primer ----- 关于初
- 下一篇: [ZZ]强签名的由来和作用