2013-07-01 36 views
1

我想知道如何獲取對象的實際基礎對象?我有一個名爲MessageBase的基類,以及很多繼承此基類的類,它們本身都會被其他類以不同深度繼承。舉個例子:如何獲取對象的基礎對象(不只是BaseType)

一些類繼承這樣的:

MessageBase --> ValueMessage --> DoubleValueMessage 

別人那樣:

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

我需要的是這樣的:我有這些繼承的一個類的對象,讓我們說DoubleValueMessage的一個實例。我不知道這個對象的類型,我只知道有一些嵌套的繼承,有一個基本對象(MessageBase),它的屬性需要設置。

現在我試圖獲得對該基礎對象的引用。所以試圖獲得ValueValue的DoubleValueMessage是基於,但我不明白如何

我嘗試了這樣的:

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關鍵字似乎不是獲取基礎對象的正確方法。

我該如何得到它?在此先感謝您的幫助!

+0

爲什麼你需要使用反射?這是財產私人? –

+0

是的,它是私人的。 – Robert

回答

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; 
} 
8

基礎對象不是單獨的對象。派生對象是基礎對象。您可以訪問基本屬性,就好像它們是派生類的屬性一樣,除非屬性是私有屬性。如果你想要一個基類的實例,然後投射該對象,例如

var baseInstance = obj as MessageBase; 

...但它聽起來並不像你真的需要這樣做。

+0

我確實需要它,謝謝! – CMS

相關問題