我将非常感谢任何帮助。我有一个字符串作为输入。我们称之为'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;
}
谢谢!
答案 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
}