通用添加方法
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
}
}
我想创建一个方法,该方法能够将项目添加到编译时类型未知的集合。它将接收两个对象:集合和项目。
目前,我有这个:
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
}
}