通用添加方法

Universal Add method

我想创建一个方法,该方法能够将项目添加到编译时类型未知的集合。它将接收两个对象:集合和项目。

目前,我有这个:

public void Add(object collection, object item) 
{
      var list = (IList)collection;
      list.Add(item);
}

问题?当集合是一个,例如,这种类型的实例时,它不起作用:

public sealed class ColumnDefinitionCollection : IList<ColumnDefinition>, IEnumerable<ColumnDefinition> 
{
}

我该怎么做才能让它适用于所有具有 Add 方法的实例?

编辑: 我尝试使用@lukegv 提出的方法,但是当集合是 ColumnDefinitionCollection (运行 在通用 Windows 应用程序中):

我创建了另一个与此问题相关的问题("Add" 未被检索)

虽然这可能不是您想要的,但您可以使用反射来检查是否存在 Add 方法并使用提供的参数调用它。像这样(未经测试):

Type t = collection.GetType();
MethodInfo add = t.GetMethod("Add");
if (add != null)
{
    params = new object[] { item };
    add.Invoke(collection, params);
}

我试图通过一些检查来扩展 Zdravko Danevs 的回答,以防止出现您和 Jon Skeet 提到的不良行为 (DateTime.Add)。 这个检查集合 Add 方法期望的类型是否等于项目提供的类型。

static void AddToCollection(object collection, object item)
{
    MethodInfo addMethod = collection.GetType().GetMethod("Add");
    if (addMethod == null || addMethod.GetParameters().Length != 1)
    {
        // handle your error
        return;
    }
    ParameterInfo parameter = addMethod.GetParameters().First();
    if (parameter.ParameterType.Equals(item.GetType()))
    {
        addMethod.Invoke(collection, new object[] { item });
    }
    else
    {
        // handle your error
    }
}