使用派生对象的反射

时间:2014-12-18 06:37:33

标签: c# reflection nested propertyinfo derived-types

我是C#的新手,需要使用Reflection执行某项任务。

事情是这样的:我有一个名为Derived的类,它派生一个名为Base的类。在Base类中,我有另一个公共类,它是一个名为Prop类的属性。在Prop类中,有一个名为propString的String类型的公共属性。 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;}
}

我需要写两个函数:

第一个收到一条"完整路径"类中的属性,需要提取该属性的类型(在我的情况下,字符串将是" Prop.propString"并且此方法的结果需要是具有该属性的A PropertyInfo对象)。

第二个获取一个对象的实例,需要对propString属性执行操作(在我的例子中,函数将获得的对象是A Derived对象)。 我知道它可以在"或多或少"那种方式,但目前效果不佳。

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 个答案:

答案 0 :(得分: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;
    }
}

我希望这会有所帮助......