2014-12-18 2 views
1

Я новичок в C# и вам нужно выполнить определенную задачу с помощью Reflection.Использование отражения с производными объектами

Дело в том, что у меня есть класс под названием Derived, который получает форму класса Base. В классе Base у меня есть еще один открытый класс, который является свойством класса Prop. В классе Prop существует общедоступное свойство типа String, называемое propString. Оба класса Derived и Base находятся под одним и тем же пространством имен. Я изобразил ситуацию ниже:

namespace mynamespace 

public class Base { 

    public Prop prop { get ; set;} 


} 

namespace mynamespace 

public class Derived : Base { 

    // some other properties of the derived class , not so relevant.... 
} 


public class Prop { 

    public String propString {get; set;} 
} 

Мне нужно написать две функции:

Первый получает строку «полного пути» свойство в классе и нужно извлечь тип, что property (В моем случае строка будет «Prop.propString», и результатом этого метода должен быть объект PropertyInfo с этим свойством).

Второй получает экземпляр объекта и должен выполнять манипуляции с свойством propString (в моем случае объект, который получит функция, является A Производным объектом). Я понял, что это может быть реализовано «более или менее» таким образом, но в настоящий момент это не работает.

public void SecondFunc(Base obj) 
{ 
     PropertyInfo propertyInfo; 
     object obj = new object(); 
     string value = (string)propertyInfo.GetValue(obj, null); 

     string afterRemovalValue = myManipulationStringFunc(value); 

     propertyInfo.SetValue(obj, afterRemovalValue, null); 

} 

Пожалуйста, ваши советы по реализации этих двух функций, и, конечно же, любые дальнейшие идеи, которые у вас есть, будут высоко оценены.

Оплачивает продавец/бесплатная поставка

Парень.

ответ

1

Я не уверен, что вы пытаетесь выполнить, и если это лучший способ сделать это. Но я изменил код, чтобы он работал. Я не сделал это так динамично, как это может быть ...

public class Base 
{ 
    public Prop prop { get; set; } 
} 

public class Derived : Base 
{ 

    // some other properties of the derived class , not so relevant.... 
} 

public class Prop 
{ 

    public String propString { get; set; } 
} 
public class MyClass 
{ 
    public void SecondFunc(object obj) 
    { 
     Type type = obj.GetType(); 
     var allClassProperties = type.GetProperties(); 
     foreach (var propertyInfo in allClassProperties) 
     { 
      if (propertyInfo.PropertyType == typeof(Prop)) 
      { 
       var pVal = (Prop)propertyInfo.GetValue(obj, null); 
       if(pVal == null) 
       { 
        //creating a new instance as the instance is not created in the ctor by default 
        pVal = new Prop(); 
        propertyInfo.SetValue(obj, pVal, null); 
       } 
       this.SecondFunc(pVal); 
      } 
      else if (propertyInfo.PropertyType == typeof(string)) 
      { 
       string value = (string)propertyInfo.GetValue(obj, null); 
       string afterRemovalValue = myManipulationStringFunc(value); 

       propertyInfo.SetValue(obj, afterRemovalValue, null); 
      } 
     } 
    } 

    private string myManipulationStringFunc(string value) 
    { 
     if (string.IsNullOrEmpty(value)) 
      value = "Value was NULL"; 
     return value; 
    } 
} 

Я надеюсь, что это помогает ...