新的课程我对XML文件中像这样如何创建运行时C#
<Student>
<column Type="String">Name</column>
<column Type="Int32">Age</column>
</Student>
我使用VS2008.i不知道runtime.i.e列额外的列可以添加到XML文件。
现在我的问题是如何创建这个类,并在(C#)Generics.i.e列表等存储此类型(创建类)。
任何帮助,将不胜感激。
新的课程我对XML文件中像这样如何创建运行时C#
<Student>
<column Type="String">Name</column>
<column Type="Int32">Age</column>
</Student>
我使用VS2008.i不知道runtime.i.e列额外的列可以添加到XML文件。
现在我的问题是如何创建这个类,并在(C#)Generics.i.e列表等存储此类型(创建类)。
任何帮助,将不胜感激。
这真的很难;如果你绝对想这样做作为运行时间类,你必须看看TypeBuilder
等。坦率地说,除非你已经很熟悉,或者这是真的重要的,它可能是不值得的。并非最不重要的:除了object
之外,您不能真正对这些对象进行编码。
您最好的选择可能是使用某种DOM(XmlDocument
,XElement
等)来读取数据,但可能会填入DataTable
。我并不是真正的普通代码中的DataTable
,但它存在,并很适合这种情况。
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
DataTable table = new DataTable();
foreach(XmlElement child in doc.DocumentElement.SelectNodes("column"))
{
table.Columns.Add(child.InnerText, ParseType(child.GetAttribute("Type")));
}
....
static Type ParseType(string type)
{
switch(type)
{
case "String": return typeof(string);
case "Int32": return typeof(int);
default: throw new NotSupportedException(type ?? "(null)");
}
}
还有'ExpandoObject',虽然它不是一个新类型,而是一个可以具有动态属性的对象,这可能是所有可能的用例中最重要的。 –
@Jeff,因为提前未知列,所以即使通过'dynamic',也不会有代码与'obj.Foo'交谈。但是,'ExpandoObject'的*字典*方面可能具有实用性。我没有提出这个选择的原因是,那么你将每个对象的所有密钥等存储起来,而不是所有对象都存储一次,而DataTable(尽管它让我深感痛苦)会这样做。 –
首先创建一个名为Student的类并使其可序列化,然后添加两个属性Name和Age。
然后喂XML这个功能
public static Object XMLStringToObject(string xml, Type objectType)
{
object obj = null;
XmlSerializer ser = null;
StringReader stringReader = null;
XmlTextReader xmlReader = null;
try
{
ser = new XmlSerializer(objectType);
stringReader = new StringReader(xml);
xmlReader = new XmlTextReader(stringReader);
obj = ser.Deserialize(xmlReader);
}
catch
{
//Do nothing for now
}
finally
{
xmlReader.Close();
stringReader.Close();
}
return obj;
}
还有更小的序列化功能,但这只是为了快速显示ü如何序列年对象,导致通常你会使用XMLStringToObject<T>
泛型主要是关于*编译时了解更多类型信息*。如果你只知道执行时的类型信息,目前还不清楚会有哪些好处。请提供更多关于您要用这些信息*做什么*的详细信息。 –
你想完成什么?如果你有在运行时生成的类,你的应用程序的其余部分仍然不知道它们,因此不能使用它们。 – Maarten
你真的是指你在运行时不知道列吗?或者在编译时? –