如何获取对象的基础对象(而不仅仅是BaseType)

时间:2013-07-01 10:06:13

标签: c# object inheritance reflection

我想知道如何获取对象的实际基础对象?我有一个名为 MessageBase 的基类,以及许多继承此基类的类,它们本身可以被不同深度的其他类继承。一个例子:

有些类继承如下:

MessageBase --> ValueMessage --> DoubleValueMessage

其他人喜欢这样:

MessageBase --> ValueMessage --> [some class] --> [some other class] --> TestMessage

我需要的是:我有一个这些继承类的对象,比方说DoubleValueMessage的一个实例。我事先并不知道这个对象的类型,我所知道的是,在嵌套继承中,有一个基础对象(MessageBase),我需要设置它的属性。

现在我尝试获取对该基础对象的引用。所以试图获取DoubleValueMessage所基于的ValueMessage,但我不明白如何

我尝试过这样:

public bool SetPropertyValue(object obj, string prop, object value)
{
    var item = obj.GetType().GetProperty(prop);
    //MessageBox.Show(obj.ToString());
    if (item != null)
    {
        item.SetValue(obj, value);
        return true;
    }
    else
    {
        if (obj.base != null)
        {
            SetPropertyValue(obj.base, prop, mb);
        }
    }

    return false;
}

我的想法是这样的:我传入一个对象(例如类型为 DoubleValueMessage ),我要设置的属性(是一个基础对象,甚至是一个属性)第一个地方?)和一个需要替换给定属性的对象,在我的例子中是 MessageBase 。所以我认为以递归方式迭代继承层次结构直到找到我需要设置的属性是个好主意。

问题是:.base关键字似乎不是获取基础对象的正确方法。

我怎样才能得到它?在此先感谢您的帮助!

2 个答案:

答案 0 :(得分:8)

基础对象不是单独的对象。派生对象基础对象。您可以只访问基本属性,就好像它们是派生类的属性一样,除非属性是私有的。如果需要基类的实例,则转换对象,例如

var baseInstance = obj as MessageBase;

...但听起来你实际上并不需要这样做。

答案 1 :(得分:1)

您可以使用以下代码获取基本类型的私有属性:

public bool SetPropertyValue(object obj, string prop, object value) {
    var item = obj.GetType().BaseType.GetProperty(prop, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    //MessageBox.Show(obj.ToString());
    if (item != null) {
        item.SetValue(obj, value);
        return true;
    }

    return false;
}

有关BindingFlags的更多详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.reflection.bindingflags.aspx

对于多层继承,您可以执行以下操作:

public bool SetPropertyValue(object obj, string prop, object value) {
    var item = GetBaseType(obj.GetType()).GetProperty(prop, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    //MessageBox.Show(obj.ToString());
    if (item != null) {
        item.SetValue(obj, value);
        return true;
    }


    return false;
}

public Type GetBaseType(Type type) {
    if (type.BaseType != typeof(object)) {
        return GetBaseType(type.BaseType);
    }
    return type;
}