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
}