2015-08-05 2 views
0

Я столкнулся с проблемой, которую я не могу понять. Я уверен, что есть простое объяснение этому, но я не понимаю, почему я получаю System.Reflection.TargetException: «Объект не соответствует типу цели», когда я пытаюсь получить свойство (в данном случае) сотрудника объект.System.Reflection.TargetException on employee.GetType(). GetProperty (property.Name)

employee.GetType().GetProperty(property.Name) 

В поисках ошибки возвращает много результатов с описанием проблем с вызовом методов Set/ПолучитьЗначением, но я не нашел решение этой.

Я установил точку останова, где выбрано исключение, и оно показывает, что property.Name действительно является значением и является реальным свойством объекта. Я также пытался вручную указать свойство, которое я знаю, существует. Все такой же.

Любые предложения?

EDIT: Пробовал следующие вместо:

Type type = typeof (Employee); //Throws the TargetException 
PropertyInfo theProperty = type.GetProperty(property.Name); 

А теперь то же самое исключение в первой строке выше вместо этого.

EDIT: Добавлен код и более подробная информация о приложении, которое я создаю.

Определение класса для сотрудника (для упрощения сопоставления с данными JSON этого класса «представляет», класс/поля в норвежском - что формат/язык данных приходит, извините :-).)

"Ansatt" = Сотрудник. «Ansattnummer» = EmployeeNo.

[JsonObject] 
public class Ansatt 
{ 
    public int Ansattnummer { get; set; } 
    public string Fornavn { get; set; } 
    public string Etternavn { get; set; } 
    public int Pin { get; set; } 
    public string Adresse { get; set; } 
    public int Postnummer { get; set; } 
    public string Poststed { get; set; } 
    public int TlfPrivat { get; set; } 
    public int MobilTlf { get; set; } 
    public string EpostAdresse { get; set; } 
    public DateTime Fodt { get; set; } 
} 

Мое приложение получает заданный набор данных из веб-службы - это может быть сотрудники, проекты или несколько других возможных наборов данных. Какие данные для извлечения определяются во время выполнения - пользователем. Пользователь также может указать через URL-запрос, какие порции, например. столбцы, набора данных, который он/она хочет. Затем программа создает csv-файл с выбранными данными.

Вот код, я использую для этого:

if (records != null && records.Count != 0) //records contains the chosen dataset - in this case Employees (Ansatt). 
       { 
        if (records.GetType() == typeof (List<Ansatt>)) 
        { 
         foreach (var model in records as List<Ansatt>) 
         { 
          var temp = new Ansatt(); 

          foreach (var property in model.GetType().GetProperties()) 
          { 

           var currentProperty = model.GetType().GetProperty(property.Name); 

           if (currentProperty != null) 
           { 
            Type type = typeof (Ansatt); //Throws System.Reflection.TargetException: 'Object does not match target type' 
            PropertyInfo tempProperty = type.GetProperty(property.Name); 
            tempProperty.SetValue(temp, currentProperty.GetValue(property.Name)); 
           } 
          } 

          csv.WriteRecord(temp); 

         } 
        } 

       } 
+0

Что такое 'property.Name'? –

+0

property.Name is int32 EmployeeNo – msk

+0

.GetProperty() берет имя свойства как String, а не int32. –

ответ

1

Как MSDN идет, вы должны использовать его таким образом:

class MyClass { 
    private int myProperty; 
    // Declare MyProperty. 
    public int MyProperty { 
     get { 
      return myProperty; 
     } 
     set { 
      myProperty = value; 
     } 
    } 
} 

public class MyTypeClass { 
    public static void Main(string[] args) { 
     try { 
      // Get the Type object corresponding to MyClass. 
      Type myType = typeof(MyClass); 
      // Get the PropertyInfo object by passing the property name. 
      PropertyInfo myPropInfo = myType.GetProperty("MyProperty"); 
      // Display the property name. 
      Console.WriteLine("The {0} property exists in MyClass.", myPropInfo.Name); 

      // Instantiate MyClass 
      var myObject = new MyClass() 
      { 
       MyProperty = 5 
      }; 

      // Get value using reflection 
      Console.WriteLine("My property value for my object is {0}.", myPropInfo.GetValue(myObject)); 

     } catch (NullReferenceException e) { 
      Console.WriteLine("The property does not exist in MyClass." + e.Message); 
     } 
    } 
} 

Для вашего кода, если вы хотите, чтобы получить значение свойства экземпляра объекта, вы должны передать объект в качестве ссылки на PropertyInfo.GetValue (объект). Вместо этого:

tempProperty.SetValue(temp, currentProperty.GetValue(property.Name)); 

ли это:

tempProperty.SetValue(temp, currentProperty.GetValue(model)); 
+0

Я попытался сделать это таким образом, и теперь исключение бросается, когда я вызываю 'Тип type = typeof (Employee); – msk

+0

Оставьте свой код для определения класса Employee. – Kerem

+0

Kerem: Обновлен вопрос с подробностями – msk

2

Вы должны указать имя свойства

PropertyInfo value = employee.GetType().GetProperty("Name"); 
1

Для вас, чтобы получить свойство объекта посредством отражения, сделать это убедиться, что имя свойства открыто с помощью getter и setter, иначе оно вернет null.

Ex.

public class Employee 
{ 
    public string YouProperty { get; set; } 
} 

var employee = new Employee(); 

var result = employee.GetType().GetProperty("YouProperty"); 

// The result is property info 

Просьба прочитать информацию here.

+0

Спасибо, но у меня уже есть публичный getter и setter на свойстве. – msk

+0

Соответствует ли ваше свойство.Name собственности, которую вы хотите получить? – jtabuloc

+0

Да, конечно! – msk