2010-06-20 13 views
2

NET 3.5的範圍內時,一個派生類的實例的引用,使用C#已經經由虛擬方法調用從一個如何從基類

我有一個類(A)的一個實例派生類(B)。在方法(類A的一個方法)中,我發現了調用類B的類型,並且使用了反射,我檢查了類B並發現了一個我想要訪問的屬性。

有什麼辦法通過反射來獲得B類的實例引用嗎?我唯一的對象是我的'這個'參考。

[編輯]

解釋說,我不是爲需要做這個完全堅果的方式:我的班級T4NmpBase(A類)。我無法控制我繼承的類(TextTransformation)或繼承自我的類(TextTemplating - B類)。如果退出但希望使用「主機」屬性,但不希望爲編寫生成TextTransformation類的文本模板代碼的程序員承擔任何負擔。

// 
// this is my class 
// 
public abstract partial class T4NmpBase : Microsoft.VisualStudio.TextTemplating.TextTransformation { 

    public override void Initialize() 
    { 
     // 
     // determine derived class info and get value of "Host" property if it exists 
     // 
    } 

} 


// 
// this class is generated by T4 in a project that I have no control over 
// 
[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.TextTemplating", "10.0.0.0")] 
public partial class PPTest : T4_NMP_Base.T4NmpBase { 

    public virtual global::Microsoft.VisualStudio.TextTemplating.ITextTemplatingEngineHost Host { ... } 

    public override void Initialize() 
    { 
     base.Initialize(); 
    } 
} 
+0

有可能與反思,但它確實聽起來像你的設計有問題。不要忘記,反思很慢。儘管如此,你可能有一個很好的理由。你沒有說。 – 2010-06-21 03:49:47

回答

1

你的情況(假設我遵循正確)你的this參考真的是你的類(B)類型,所以你可以使用它來獲取屬性的值。所以,只是爲了確保我跟隨正確,你已經得到的東西看起來像:

public class ClassA 
{ 
    public virtual void VirtualMethod() 
    { 
     // Do your property investigation here 
    } 
} 

public class ClassB: ClassA 
{ 
    public override void VirtualMethod() 
    { 
     // Code for ClassB 
    } 
} 

並且使用的是像調用虛方法:

ClassA instance = new ClassB(); 
instance.VirtualMethod() 

所以,如果是這樣的話那麼你應該可以通過以下方式獲得該物業的價值:

PropertyInfo proeprtyOnClassB // Assume you got this already via reflection 
object propertyValue = propertyOnClassB.GetGetMethod().Invoke(this,null); 
+0

這是我嘗試的第一件事,但沒有奏效。今天早上醒來,意識到我沒有用虛擬方法做這件事,而是在構造器中做這件事!不會在構造函數中工作,因爲類B還沒有構造!將代碼移到應該已經存在的虛函數中,現在它可以工作!謝謝。 – 2010-06-21 16:15:57

0

如果我理解正確的,從A類,你希望通過它的具體類型B.訪問當前實例的功能,除非該成員是不是A,因爲它是不公開的,在另一個程序集中定義可訪問的,等你不需要反思。下面的工作,如果在A類的代碼可以看到派生類B.

B thisAsB = this as B; 
if (thisAsB != null) { 
    // ... 
} 

的成員,但它並質疑類的設計,因爲A類不應該知道它的子類東西。

1

這聽起來像是一個真正的問題與您的設計。

是否有可能將B類的財產置疑,並使其成爲A類的虛擬財產?然後,你可以重寫它B中,但仍從A訪問B的屬性例如:

class A 
{ 
    public virtual string P 
    { 
     get { return "A"; } 
    } 

    public A() 
    { 
     Console.WriteLine(this.P); 
    } 
} 

class B : A 
{ 
    public override string P 
    { 
     get { return "B"; } 
    } 

    public B() : base() { } 
} 

使用:

B b = new B(); // prints "B"