如何在RunTime C#上创建新类

时间:2012-07-03 06:40:16

标签: c# class runtime

我有xml文件像这样

<Student>
    <column Type="String">Name</column>
    <column Type="Int32">Age</column>
 </Student>

我正在使用VS2008.i在运行时不知道列.i.e额外的列可以添加到xml文件。

现在我的问题是如何创建这个类并将此类型(创建的类)存储在(C#)Generics.i.e List等中。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

这真的很难;如果您绝对想要将作为运行时类,那么您必须查看TypeBuilder等。坦率地说,除非您已经熟悉它,否则这真的< / em>很重要,它可能不值得。尤其是:除了object之外,你无法对这些对象进行真正的编码。

您最好的选择可能是使用某种DOM(XmlDocumentXElement等)来读取数据,但可能会填充到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)");
    }
}

答案 1 :(得分:-1)

首先创建一个名为Student的类并使其可序列化,然后添加2个属性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>