2012-07-03 2 views
1

У меня есть XML-файл, как этоКак создать новые классы на RunTime C#

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

я использую VS2008.i не знаю столбцов на runtime.i.e дополнительные столбцы можно добавить в XML-файл.

Теперь мой вопрос: как создать класс этого и сохранить этот тип (созданный класс) в (C#) Generics.i.e List и т. Д.

любая помощь будет оценена.

+0

Дженерики в основном о том, чтобы узнать больше информации о типе в * время компиляции *. Если вы только знаете информацию о типе во время выполнения, неясно, какая польза там будет. Пожалуйста, дайте более подробную информацию о том, что вы пытаетесь * сделать * с этой информацией. –

+2

Что вы пытаетесь достичь? Если у вас есть классы, сгенерированные во время выполнения, остальная часть вашего приложения все еще не знает их и, следовательно, не может их использовать. – Maarten

+0

Вы действительно имеете в виду, что не знаете столбцы во время выполнения? Или во время компиляции? –

ответ

1

Это действительно сложно; если вы абсолютно хотели сделать это как классы времени выполнения, вам нужно посмотреть на 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)"); 
    } 
} 
+1

Существует также «ExpandoObject», хотя это не новый тип, а скорее объект, который может иметь динамические свойства, что, вероятно, все, что имеет значение в его вероятном случае использования. –

+1

@Jeff, поскольку столбцы не известны заранее, не будет кода, говорящего с 'obj.Foo', даже через' dynamic'. Тем не менее, * словарь * аспект 'ExpandoObject' может иметь полезность. Причина, по которой я не предполагал, что это вариант, заключается в том, что вы сохраняете все ключи и т. Д. На один объект, а не один раз для всех объектов, что «DataTable» (в то время как он сильно меня раздражает). –

-1

Сначала создайте класс под названием Студент и сделайте его сериализуемым, затем добавьте 2 свойства Имя и возраст.

затем кормить 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; 
} 

Есть более мелкие функции сериализации, но это только, чтобы показать U быстро, как сериализовать объект в год, причиной обычно вы будете использовать XMLStringToObject<T>

Смежные вопросы