2016-04-28 2 views
0

Я использую подпрограмму для чтения данных из файлов XML похож на это:Почему мое приведение недействительно?

<VerificationSample X1 = "1" X3 = "3" ../> 

используя этот вызов:

XmlReader reader = XmlReader.Create(path); 
reader.ReadToFollowing("VerificationSample"); 

this.X1 = (double)FileStructure.GetAttributeSafe(reader, "X1", typeof(double)); // exists 
this.X2 = (double)FileStructure.GetAttributeSafe(reader, "X2", typeof(double)); // doesn't exist 

Однако некоторые атрибуты не могут существовать, так что я с этим справиться, используя эту процедуру внутри что функция для чтения атрибутов определение:

public static object GetAttributeSafe(XmlReader reader, string attributeName, Type objectType) 
{ 
    // .. 
    string value = reader.GetAttribute(attributeName); 

    if (value != null) // attribute exists 
    { 
     if (objectType != typeof (string)) 
     { 
      var converter = TypeDescriptor.GetConverter(objectType); 
      returnValue = converter.ConvertFrom(value); 
     } 

     else // is already a string and doesn't need to be converted 
     { 
      return value; 
     } 
    } 
    else // attribute doesn't exist 
    { 
     return "0"; 
    } 
} 

Если атрибут не существует, приложение появляется сообщение об ошибке:

Specified cast is not valid

В чем моя ошибка?

+0

Если атрибут не существует, ваш метод возвращает * 'string' *' "0" '. Это нельзя отнести к 'double'. –

+0

@john, но если читатель читает '' 0 "' из файла, который является строкой. Оно работает. И если я делаю это 'значение =" 0 "; return value; 'также не работает. Зачем? –

+0

Когда вы читаете «0» из файла, вы пытаетесь преобразовать его в запрошенный тип. Вы не выполняете этот путь кода, если запрашиваемый атрибут отсутствует. –

ответ

2

Если атрибут не существует, вы должны указать return "0", который затем пытается сбрасывать в двойное. Вам необходимо вернуть значение по умолчанию из любой objectType является, возможно, делая

else // attribute doesn't exist 
{ 
    if(objectType.IsValueType) 
    { 
     return Activator.CreateInstance(objectType); 
    } 
    return null; 
} 

Вы только вернет нулевое значение, если вы пытаетесь преобразовать что-то не-неизменного как класс вместо междунар или строку, которая будет дуть все равно ваша функция; это просто так, что все пути кода возвращают что-то.

+0

, но я не хочу «возвращать null» в любом случае правильно? Итак, где я должен поместить ваш код? Кроме того, если вы могли бы объяснить мне, почему, если читатель читает '' 0 ''из файла, который является строкой, он отлично работает –

+0

Я просто изменил свой« return »0»; 'на ваш' return Activator.CreateInstance (objectType); 'Спасибо –

+1

Если вы читаете' '0" 'из файла, он преобразуется в' converter'; если вы вернете «0», это не так. –

3

Потому что вы возвращаете «0», что является строкой, и вы не можете бросить это, чтобы удвоить. Вместо этого используйте Convert.toDouble (String s).

+0

Я вижу. Это путаница, потому что она читает '' 0'' просто отлично от файлов. Ваше решение сработало. Благодарю. Но что, если это не двойной? Мне нужно сделать его общим –

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