2013-06-25 3 views
4

У меня есть класс с более чем 100 уникальными именами и более 20 дочерних классов, иногда в списках. Ниже приводится значительно упрощена иллюстрацией того, что я имею в виду:Вызовите свойство по имени

public class classA 
    { 
     public String PropertyA1 { get; set; } 
     public int PropertyA2{get;set;} 
     public List<classB> myList; 
     public classC myClass { get; set; } 

     public void SetProperty(String PropertyName) 
     { 
      // Match property name to property in this class or child class. 
     } 
    } 

    class classB 
    { 
     public String PropertyB1 { get; set; } 
     public bool PropertyB2 { get; set; } 
    } 

    class classC 
    { 
     public String PropertyC1 { get; set; } 
    } 

Я хотел бы сделать две вещи, которые могут или не могут быть возможны. Первое, что мне нужно сделать, это перебрать все публичные свойства, в том числе дочерние классы и классы в списке, и перевести значения. Я знаю, что могу выполнить синтаксический анализ, сериализуя его в xml и анализируя результаты. У меня даже есть код для преобразования в xml, так как функция класса заключается в создании объекта xml. Тем не менее, я беспокоюсь, что анализ XML-кода может быть намного дороже, чем доступ к свойствам посредством отражения. Можно ли использовать отражение таким образом, и будет ли оно быстрее, чем изменение xml?

Другое, что я хотел бы сделать, это получить доступ к любому свойству, передав имя свойства в метод. Я понимаю, что мне нужен отдельный метод доступа к классам в списках и, возможно, придется преобразовать список в словарь. Вопрос в том, возможно ли это, и будет ли код нужен только в родительском классе, или каждый из дочерних классов должен будет повторить код?

+0

звучит, как вам нужно смотреть в размышления. Посмотрите на 'Type.GetProperty' и' Type.GetProperties' для начала. –

+1

То, что вы пытаетесь сделать, возможно благодаря отражению, но мы хотели бы узнать, что вы узнали до сих пор, пытаясь достичь этого, и где вы застряли –

+0

XML-сериализатор использует отражение для создания XML-документа. Я думаю, что вы найдете отражение быстрее – Jay

ответ

8

Метод, который будет установить свойство с заданным именем:

public void SetProperty(String propertyName, object value) 
    { 
     this.GetType().GetProperty(propertyName).SetValue(this, value); 
    } 

Несколько вещей о реализации:

  • типа используется динамический фактический тип объекта, который будет найти члены, которые находятся в производных классах (до тех пор, пока объект имеет производный тип курса).
  • Информация о недвижимости не имеет представления, к какому объекту он пришел, поэтому this необходимо снова передать в звонок SetValue().

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

var properties = this.GetType().GetProperties(); 
+0

Вы можете сделать это универсальное расширение, тогда вам не нужно вставлять этот метод в каждую иерархию классов. – Jay

+0

Спасибо Андерсу за ваш ответ. Я считаю, что это будет работать для базового класса, но могу ли я установить значение PropertyC1, вызывающего этот метод в classA? – Tim

+0

@Jay: Метод 'SetProperty' должен быть членом базового класса. Не делайте это расширение - это сделает его доступным для большего количества мест. Это уродливо, так что давайте сохраним его только там, где это необходимо. –