C# 如何使用反射向集合添加新项

C# 如何使用反射向集合添加新项,c#,.net,reflection,C#,.net,Reflection,我试图使用反射将未知对象添加到未知集合类型,但在实际执行“添加”时遇到异常。我想知道是否有人能指出我做错了什么或是其他的选择 我的基本方法是迭代通过反射检索的IEnumerable,然后将新项添加到第二个集合中,我可以稍后将其用作替换集合(包含一些更新的值): 例外情况是: 值“”不是“System.Collections.Generic.List`1[Eclipsys.Enterprise.Entities.Registration.VisitLite]”类型,因此不能在此泛型集合中使用 根据

我试图使用反射将未知对象添加到未知集合类型,但在实际执行“添加”时遇到异常。我想知道是否有人能指出我做错了什么或是其他的选择

我的基本方法是迭代通过反射检索的IEnumerable,然后将新项添加到第二个集合中,我可以稍后将其用作替换集合(包含一些更新的值):

例外情况是:

值“”不是“System.Collections.Generic.List`1[Eclipsys.Enterprise.Entities.Registration.VisitLite]”类型,因此不能在此泛型集合中使用


根据第一个异常,您正试图将
eclipses.Enterprise.Entities.Registration.VisitLite
强制转换为
列表
。我想这是你的问题

试试这个:

 businessObject = //your collection;
 //there might be two Add methods. Make sure you get the one which has one parameter.
 MethodInfo addMethod = businessObject.GetType().GetMethods()
.Where(m => m.Name == "Add" && m.GetParameters().Count() == 1).FirstOrDefault();
 foreach(object obj in businessObject as IEnumerable)
 {
     addMethod.Invoke(businessObject, new object[] { obj });
 }

根据第一个例外,您正试图将“eclipses.Enterprise.Entities.Registration.VisitLite”强制转换为“List”。我想这是你的问题。你为什么要这样做?使用适当的泛型。对于这样一个常见的任务,必须使用反射,这表明您将所有这些代码放在了错误的位置。如果您使用反射,则强制转换的意义何在?如果您的所有集合类型都有Add方法,则只需使用dynamic。除了在罕见和不寻常的情况下,如果您发现自己在代码中使用了大量的反射和动态,那么您很可能犯了一些可怕的错误!谢谢你的回复。。。但是,我仍然使用上述MethodInfo代码得到相同的异常:类型为“Eclipsys.Enterprise.Entities.Registration.VisitLite”的对象无法转换为类型为“System.Collections.Generic.List`1[Eclipsys.Enterprise.Entities.Registration.VisitLite]”。我的错误-异常实际上不同。实际上是“对象与目标类型不匹配”。我试着将它转换为它在一个实例中寻找的完全相同的类型,但仍然得到相同的错误Eclipsys.Enterprise.Entities.Registration.VisitLite访问=(Eclipsys.Enterprise.Entities.Registration.VisitLite)o;MethodInfo addMethod=businessObject.GetType().GetMethod(“添加”);Invoke(newCollection,新对象[]{visit})`@dustinkofed更改此行:addMethod.Invoke(newCollection,newobject[]{visit});调用(businessObject,新对象[]{visit});然后让我知道会发生什么。谢谢。。。事实上,我最终用了另一种方式。您可以将
MethodInfo addMethod=..…
重写为
MethodInfo addMethod=businessObject.GetType().GetMethods().FirstOrDefault(m=>m.Name==“Add”&&m.GetParameters().Count()==1)
newCollection.Add(entity); 
 businessObject = //your collection;
 //there might be two Add methods. Make sure you get the one which has one parameter.
 MethodInfo addMethod = businessObject.GetType().GetMethods()
.Where(m => m.Name == "Add" && m.GetParameters().Count() == 1).FirstOrDefault();
 foreach(object obj in businessObject as IEnumerable)
 {
     addMethod.Invoke(businessObject, new object[] { obj });
 }