我正在研究一种动态复制相同名称和类型的变量的方法(不一定来自同一个类)。我不想盲目地复制所有内容,因为网站的管理员具有该功能而用户没有。例如,以下是一些事件对象:
public class Event
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime EventDate { get; set; }
public int Organization { get; set; }
public string Location { get; set; }
public int SpotsAvailable { get; set; }
public int CreatedBy { get; set; }
public DateTime CreatedDate { get; set; }
public int ModifiedBy { get; set; }
public DateTime ModifiedDate { get; set; }
public int ApprovedBy { get; set; }
public DateTime ApprovedDate { get; set; }
public bool AutomaticallyApproved { get; set; }
}
我想要做的是拥有一个只能克隆我想要的对象的泛型方法,忽略我想要留空的变量名数组或属性的默认值。 Based off of this post我创建了一个方法,复制所有名称相同且具有相同属性类型的字段,一切都很好。现在我想添加一行(if(ignoreObjects.Contains(srcProp.Name))),它可以检查ignore数组是否包含当前属性:
public void Clone(ref object destination, object source, object[] ignoreObjects)
{
// Getting the Types of the objects
Type typeDest = destination.GetType();
Type typeSrc = source.GetType();
// Iterate the Properties of the source instance and
// populate them from their desination counterparts
PropertyInfo[] srcProperties = typeSrc.GetProperties();
foreach (PropertyInfo srcProp in srcProperties)
{
if(ignoreObjects.Contains(srcProp.Name))
{
continue;
}
PropertyInfo targetProperty = typeDest.GetProperty(srcProp.Name);
if (targetProperty == null)
{
continue;
}
if (!targetProperty.CanWrite)
{
continue;
}
if (targetProperty.GetSetMethod(true) != null && targetProperty.GetSetMethod(true).IsPrivate)
{
continue;
}
if ((targetProperty.GetSetMethod().Attributes & MethodAttributes.Static) != 0)
{
continue;
}
if (!targetProperty.PropertyType.IsAssignableFrom(srcProp.PropertyType))
{
continue;
}
targetProperty.SetValue(destination, srcProp.GetValue(source, null), null);
}
}
我理想情况下会像上面这样调用上面的方法:
Clone(ref newEvent, eventInfo, { eventInfo.ApprovedBy, eventInfo.ApprovedDate, eventInfo.Organization, eventInfo.SpotsAvailable } );
这会复制来自" eventInfo"的所有事件信息。进入" newEvent",忽略ApprovedBy,ApprovedDate,Organization和SpotsAvailable等字段。
是否可以将一个列表/变量数组发送到一个被忽略的数组?我当然可以添加一个"名称"在每个变量之前创建一个字符串数组(例如:nameof(eventInfo.ApprovedBy))但我更愿意只引用类属性本身来减少代码。
我之前使用的是AutoMapper,但想要了解这是否可以在没有任何第三方工具的情况下使用。
答案 0 :(得分:0)
您必须使用object来传输属性名称或PropertyInfo
,您不能传递属性值然后检测它是什么属性。您应该使用params
关键字:
public void Clone(object destination, object source, params String[] ignoreObjects)
并调用方法:
Clone(newEvent, eventInfo, property1, property2, property3, ...);
您传递了该对象,因此您不需要ref
个关键字。