方法1
定义基类
/// <summary>
/// 克隆对象【[ExcludeCopy]排除】
/// </summary>
public class BaseModel
{
public void Clone<T>(T dataObj)
{
var targetType = this.GetType();
var dataType = dataObj.GetType();
foreach (var p in dataType.GetProperties())
{
var tProperty = targetType.GetProperty(p.Name);
if (null != tProperty)
{
tProperty.SetValue(this, p.GetValue(dataObj, null), null);
}
}
}
}
//定义排除属性
public class ModelAttribute
{
public class ExcludeCopyAttribute : System.Attribute { }
}
模型继承基类
public class Model : BaseModel<Model>
{
/// <summary>
/// GUID
/// </summary>
public string GUID { get; set; }
}
使用
var model = new DrugModel
{
GUID = "1"
};
var copyModel = new Model();
copyModel .Clone(drug);
方法2
定义扩展方法
/// <summary>
/// 方法1
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="target"></param>
/// <param name="dataObj"></param>
public static void Clone<T>(this T target, T dataObj)
{
var targetType = target.GetType();
var dataType = dataObj.GetType();
foreach (var p in dataType.GetProperties())
{
var tProperty = targetType.GetProperty(p.Name);
if (null != tProperty)
{
tProperty.SetValue(target, p.GetValue(dataObj, null), null);
}
}
}
/// <summary>
/// 方法2
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dataObj"></param>
/// <returns></returns>
public static T Clone<T>(this T dataObj) where T : new()
{
var target = new T();
var targetType = target.GetType();
var dataType = dataObj.GetType();
foreach (var p in dataType.GetProperties())
{
var tProperty = targetType.GetProperty(p.Name);
if (null != tProperty)
{
tProperty.SetValue(target, p.GetValue(dataObj, null), null);
}
}
return target;
}
用法
//用法1(model2克隆model1数据)
var model1= new Model();
...
var model2= new Model();
model2.Clone(model1);
//用法2(调用克隆方法返回一个新Model,直接接收就行了,这个感觉比较方便)
var m = model.Clone();