将数组/变量列表传递给方法

时间:2016-07-03 20:51:26

标签: c# .net methods

我正在研究一种动态复制相同名称和类型的变量的方法(不一定来自同一个类)。我不想盲目地复制所有内容,因为网站的管理员具有该功能而用户没有。例如,以下是一些事件对象:

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,但想要了解这是否可以在没有任何第三方工具的情况下使用。

1 个答案:

答案 0 :(得分:0)

您必须使用object来传输属性名称或PropertyInfo,您不能传递属性值然后检测它是什么属性。您应该使用params关键字:

public void Clone(object destination, object source, params String[] ignoreObjects)

并调用方法:

Clone(newEvent, eventInfo, property1, property2, property3, ...);

您传递了该对象,因此您不需要ref个关键字。