C# C获取泛型对象的成员

C# C获取泛型对象的成员,c#,C#,我将非常感谢任何帮助。我有一个字符串作为输入。我们称之为“表名”。我想创建一个表名集合,其中表名是引用项目中的实际对象。我做了以下工作: Object obj = Activator.CreateInstance("ClassLibrary", "ClassLibrary." + table_name); Type CollectionType = typeof(Collection<>).MakeGenericType(new[] { obj.GetType() }); IColl

我将非常感谢任何帮助。我有一个字符串作为输入。我们称之为“表名”。我想创建一个表名集合,其中表名是引用项目中的实际对象。我做了以下工作:

Object obj = Activator.CreateInstance("ClassLibrary", "ClassLibrary." + table_name);
Type CollectionType = typeof(Collection<>).MakeGenericType(new[] { obj.GetType() });
ICollection c = (ICollection)Activator.CreateInstance(CollectionType);
到目前为止一切正常。我可以看到集合中元素的数量。但问题是,当我尝试遍历集合时,它不会显示其元素。我只能在运行时看到它们。有没有办法在编译时检索集合的成员?我想要像这样的东西:

for(int i = 0; i < c.Count; i++){
    label.Text = c[i].Details;
}

谢谢

是的,但您必须回答以下问题:有哪些成员,您计划如何使用它们,最重要的是,当您编写引用它们的代码时,编译器如何知道您的意思,例如详细信息。例如,如果您的对象始终实现接口

public interface IHasDetails
{
    string Details { get; }
}
然后可以将对象强制转换为该类型:

label.Text = ((IHasDetails)c[i]).Details;
如果您只想动态访问它,请使用:

未定义索引访问器,因此无法执行c[i]


不能改用吗?

为了在编译时访问成员,需要使用具有可用成员的具体类型。考虑到动态访问所涉及的类型,除非它们有一个公共的、已知的基类型或接口,否则这似乎是不可能的。如果没有这些机制中的任何一种,您将沦为某种动态访问

因为我只需要ICollection中每个元素的详细信息,所以我使用System.Xml.Serialization来获取包含集合中特定元素信息的字符串

for (int i = 0; i < c.Count; i++)
        {
            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(c[i].GetType());
            using (StringWriter writer = new StringWriter())
            {
                x.Serialize(writer, c[i]);
                String details = writer.ToString();
            }
                   //do here what ever you want
        } 

有什么原因不能正常地声明集合吗?这似乎是一种令人难以置信的迂回方式,编译器不知道它们在编译时键入什么,由运行时确定。如果您在编译时知道,您就不需要进行这些反射了。您的目标是什么版本的C?C4.0和5.0具有动态对象。
label.Text = ((dynamic)c[i]).Details;
for (int i = 0; i < c.Count; i++)
        {
            System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(c[i].GetType());
            using (StringWriter writer = new StringWriter())
            {
                x.Serialize(writer, c[i]);
                String details = writer.ToString();
            }
                   //do here what ever you want
        }