2013-07-29 3 views
2

Я выполняю серию Xml Serialization, и я получаю ошибку компиляции элемента.typeof() when Не удается неявно преобразовать тип 'System.Type' в 'string'

код с ошибкой является:

public class EPubBody 
{ 
    [XmlElement(ElementName = "Image", DataType = typeof(EPubImage))] 
    public object[] BodyItems; 
} 

Ошибка на typeof(EPubImage) части. Ошибка Cannot implicitly convert type 'System.Type' to 'string'.

Класс EPubImage находится в том же namspace, и выглядит следующим образом:

public class EPubImage 
{ 
    [XmlAttribute("imagePath")] 
    public string ImagePath { get; set; } 

} 

Я думаю typeof(EPubImage) возвращается в System.Type вместо string. Любые указатели на то, как гарантировать, что оператор typeof вернет строку, а не System.Type?

+1

Возможно 'typeof (EPubImage) .ToString()' – SchautDollar

+0

'DataType', скорее всего, ожидает строку, а не тип. Попробуйте использовать полное имя «EPubImage». – Tim

+0

@ Тит, хотя, когда он говорит, что ожидает «строка», это означало, что ему нужно 32-битное целое число. Тогда я должен быть неправ. –

ответ

1

MSDN Documentation for XmlElementAttribute четко говорится, что DataType является string, в то время как Type свойство имеет Type.

+0

Я предполагаю, что я был введен в заблуждение в примере в Замечаниях к http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlelementattribute(v = vs.100) .aspx – Reuben

+0

Есть ли какие-либо переопределения, которые я могу сделать, чтобы typeof (EPubImage) вернул строку? – Reuben

+0

Нет. Что вам нужно в атрибуте - константа _compile-time_. Это не то, что предоставляет оператор/функция, возвращающая строку. Простой факт, что он возвращает _ что-либо означает, что он может быть переменным (поскольку C# не имеет понятия _constness_). –

2

Согласно documentation, то DataType свойство используется для указания типа XSD данных, а не тип .NET:

тип данных схемы XML, как это определено в World Wide Web Consortium (WWW. w3.org) с именем «XML-схема 2: Типы данных».

Попробуйте вместо этого:

public class EPubBody 
{ 
    [XmlElement(ElementName = "Image")] 
    public EPubImage[] BodyItems; 
} 
+0

Я предпочел бы сохранить поле массивом объекта, так как я буду использовать несколько типов, как в примерах по адресу http://msdn.microsoft.com/en-us/library/system.xml.serialization. xmlelementattribute.type (v = vs.100) .aspx – Reuben

0

Я нашел переопределение для XmlElement() для XmlElement (string, Type), поэтому я попробовал это вместо этого, и он работает.

public class EPubBody 
{ 
    [XmlElement("image", typeof(EPubImage))] 
    public object[] BodyItems; 
} 

Когда я говорю «это работает», я имею в виду, что я больше не ошибка времени компиляции. Наличие этого поведения, как видно из Remarks section of this document, является еще одной проблемой.

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