2016年2月16日 星期二

【C#】Auto assign(reflect) same name properties between different class obj

自動將 A 類別相同名稱的屬性值匯給 B類別

網路上有很多開源 API 可以做這件事,可是如果你像我一樣需要自己寫一個簡單的的話
public static B CopyProperties<A, B>(A a, B b)
{
    var typeOfA = a.GetType();
    var typeOfB = b.GetType();

    // copy properties
    foreach (var propertyOfA in typeOfA.GetProperties())
    {
        try
        {
            var propertyOfB = typeOfB.GetProperty(propertyOfA.Name);
            if (propertyOfB != null)
            {
                if (propertyOfA.PropertyType.Namespace == "System")
                    propertyOfB.SetValue(b, propertyOfA.GetValue(a));
                else
                {
                    if (b is ICloneable)
                        propertyOfB.SetValue(b, ((ICloneable)propertyOfA.GetValue(a)).Clone());
                    else
                        throw new Exception(string.Format(
                            "Property {0} is customer class but didn't implement ICloneable.", 
                            propertyOfB.Name));
                }
                
            }
            else
                throw new Exception(string.Format(
                    "Target class didn't have Property {0}.", 
                    propertyOfA.Name));

        }
        catch (Exception ex)
        {
            string msg = ex.Message;
        }
    }
    return b;
}

其中
if (propertyOfA.PropertyType.Namespace == "System")
為判斷 prop 是否是基礎型別,是的話就直接賦予,不是的話則要實作 ICloneable 以深複製(未實作則不複製該 prop)。

範例: github

ref: reflectioncheck if implement spec interfacecheck if has spec methodcheck if has spec propcheck if its a system basic type(ex. int, char, bool, and so on).

沒有留言:

張貼留言