如何从基类中获取对派生类实例的引用

时间:2010-06-20 23:49:04

标签: c# .net reflection

.Net 3.5,使用C#

我有一个类(A)的实例,它是通过派生类(B)中的虚方法调用的。在方法(类A的方法)中,我发现了进行调用的B类的类型,并且使用了反射,我检查了类B,并发现了一个我想要访问其值的属性。

有没有办法通过反射来获取B类的实例引用?我唯一的目标是我的'this'参考。

[编辑]

通过解释我并不完全不需要这样做:我的班级是T4NmpBase(A班)。我无法控制我继承的类(TextTransformation)或继承自我的类(TextTemplating - 类B)。我想使用“Host”属性,如果它退出但不想给正在编写生成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();
    }
}

3 个答案:

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

答案 1 :(得分: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"

答案 2 :(得分:0)

如果我理解正确,从A类开始,您希望通过其具体类型B访问当前实例的功能。除非A不能访问该成员,因为它是非公共的,在另一个程序集中定义,等等。需要反思。如果A类中的代码可以看到派生类B的成员,则以下内容将起作用。

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

但它确实会对类的设计产生疑问,因为A类不应该对其子类有任何了解。