C#获取Generic对象的成员

时间:2014-02-13 18:37:19

标签: c#

我将非常感谢任何帮助。我有一个字符串作为输入。我们称之为'table_name'。我想创建一个table_names集合(其中table_name是引用项目中的实际对象)。我做了以下事情:

Object obj = Activator.CreateInstance("ClassLibrary", "ClassLibrary." + table_name);
Type CollectionType = typeof(Collection<>).MakeGenericType(new[] { obj.GetType() });
ICollection c = (ICollection)Activator.CreateInstance(CollectionType);

然后我调用了一个方法(位于不同的项目中并返回对象的集合)来填写我的ICollection对象(在本例中为c):

object[] parameters = new object[] { x_coord, y_coord, buffer_dist};
c = (ICollection)sde_db.GetType().GetMethod("Method" + table_name).Invoke(sde_db, parameters);

到目前为止一切正常。我可以看到集合中的元素数量。但问题是,当我尝试遍历集合时,它不会显示其元素。我只能在运行时看到它们。有没有办法在编译期间检索集合的成员?我想要这样的东西:

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

谢谢!

4 个答案:

答案 0 :(得分:0)

是的,但你必须回答成员在那里以及你打算如何使用它们的问题(最重要的是,编译器在编写引用它们的代码时知道你的意思,例如{{1} })。例如。如果你的对象总是实现一个接口......

.Details

然后您可以将对象强制转换为该类型:

public interface IHasDetails
{
    string Details { get; }
}

如果您只想动态访问它,请使用dynamic

label.Text = ((IHasDetails)c[i]).Details;

答案 1 :(得分:0)

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

您不能使用IList吗?

答案 2 :(得分:0)

为了在编译期间访问成员,您需要使用具有可用成员的具体类型。鉴于您动态访问所涉及的类型,除非它们具有通用且已知的基本类型或接口,否则这似乎是不可能的。如果没有这些机制之一,您将被简化为某种动态访问。

答案 3 :(得分:0)

由于我只需要有关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
        } 
相关问题