2013-09-19 3 views
1

проблемы я в настоящее время имею что я пытаюсь бросить на неизвестное, и я получаю это сообщение из следующего кода:кастинг на отражение неизвестного типа в C#

Типа или пространства имен имя " thistype»не может быть найден (вы пропали без вести с помощью директивы или ссылка на сборку?)

String thistype = null; 

for (int i = 0; i < items.Length; i++) 
{ 

    thistype = typeof(BugManagerQueryOptions).GetProperty(items[i].ToString()).PropertyType.Name; 
    typeof(BugManagerQueryOptions).GetProperty(items[i].ToString()).SetValue(currentSearch,(thistype)properties[i], null); 

} 

Если вам нужна дополнительная информация просто спросить и любая помощь будет признателен, спасибо. - Крис

+4

Зачем вообще вообще бросать? 'SetValue' принимает' объект'. Кастинг в основном относится к типам, которые вы знаете * во время компиляции *. –

ответ

4

Вам не нужно, чтобы бросить на все, предполагая, что значение properties[i] уже фактически правильный тип:

for (int i = 0; i < items.Length; i++) 
{ 
    typeof(BugManagerQueryOptions).GetProperty(items[i].ToString()) 
            .SetValue(currentSearch, properties[i], null); 
} 

Если вы пытаетесь вызвать определенное пользователем преобразование (например, от XElement до String), то это намного сложнее.

+0

проблема состоит в том, что элементы [i] относятся к различным полям, например, ID, а имя и свойства должны быть выбраны как int для поля идентификатора, или оно упадет со следующим исключением: Объект типа 'System.String 'не может быть преобразован в тип' System.Nullable'1 [System.Int32] '. – Chris

+0

@Chris: В любом случае вы не сможете * прикрывать * от 'string' до' int? '. Похоже, вам нужно выполнить соответствующие преобразования, например. используя 'int.Parse'. Не сосредотачивайтесь на кастинге - это не проблема. Вам нужно сосредоточиться на том, чтобы значение, которое вы пытаетесь указать, относится к правильному типу времени выполнения. –

+0

Спасибо, я буду продолжать изучать его, приветствует помощь, хотя и ценю это :) – Chris

0

Для любой будущей ссылки, это (очень неряшливый) способ сделать то, что я пытался сделать, я буду совершенствоваться, но я думал, что должен оставить это здесь для кого-либо еще.

  thistype = typeof(BugManagerQueryOptions).GetProperty(items[i].ToString()).PropertyType.FullName; 

      if (thistype == "System.String") 
      { 
       typeof(BugManagerQueryOptions).GetProperty(items[i]).SetValue(currentSearch, properties[i], null); 
      } 
      else if (thistype == "System.Nullable`1[[System.Int64, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]") 
      { 

       long number = Int64.Parse(properties[i]); 
       typeof(BugManagerQueryOptions).GetProperty(items[i]).SetValue(currentSearch, number, null); 

      } 
      else if (thistype == "System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]") 
      { 

       int number = Int32.Parse(properties[i]); 
       typeof(BugManagerQueryOptions).GetProperty(items[i]).SetValue(currentSearch, number, null); 

      } 
+0

Используйте 'typeof (string)' и т. Д. Вместо сравнения имен. –

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