2013-03-17 56 views
0

我需要将通过反射创建的对象添加到通用列表中。在编译时,我不知道这个对象的确切类型或通用列表的类型,但我可以确保类型匹配。C#:将项目插入通用列表的反射

我发现了很多关于类似问题的帖子,但他们要么不需要通用列表,要么在编译时知道类型。

任何人都可以帮忙吗?

回答

0

使用SomeObject.GetType()来获得它的类型:

MyClass t1 = new MyClass(); 
    Type t = t1.GetType(); 
3

如果l是您的泛型列表,o是你的对象:

l.GetType().GetMethod("Add").Invoke(l, new object[] { o }); 

jgauffin建议,你可以执行以下测试以确保您可以将对象添加到列表中:

if (l.GetType().GetGenericArguments()[0].IsAssignableFrom(o.GetType())) 
{ 
    l.GetType().GetMethod("Add").Invoke(l, new object[] { o }); 
} 
+0

+1。你还可以显示如何使用'type.GetGenericArguments()'和'type.IsAssignableFrom()'来检查对象是否是第一个正确的类型。 – jgauffin 2013-03-17 11:12:46

+0

使用这种方法可以实现ForEach方法吗?如果是的话,我们如何将一个Action传递给foreach来执行? – 2014-06-13 14:40:15

+0

@MahdiTahsildari是的,如果您有一个兼容类型的“Action '委托,那么您可以完全按照上面”Add“方法的示例进行操作。 – 2014-06-15 20:42:05