Как получить ссылку на экземпляр производного класса из базового класса - PullRequest
2 голосов
/ 21 июня 2010

.Net 3.5, используя C #

У меня есть экземпляр класса (A), который был вызван через виртуальный метод из производного класса (B).В методе (метод класса A) я обнаружил тип класса B, который сделал вызов, и, используя отражение, я изучил класс B и обнаружил свойство, к значению которого я хочу получить доступ.

IsЕсть ли способ через отражение, чтобы получить ссылку на экземпляр класса B?Единственный объект, который у меня есть, это моя ссылка "this".

[Edit]

Объясняя, что я не совсем схожу с ума по необходимости делать это: Мой класс - T4NmpBase (classА).У меня нет контроля над классом, в котором я наследую (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 ]

1 голос
/ 21 июня 2010

В вашем случае (при условии, что я правильно следую) ваша 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 голос
/ 21 июня 2010

Звучит как настоящая проблема с вашим дизайном.

Можно ли взять рассматриваемое свойство класса B и сделать его виртуальным свойством класса A? Затем вы можете переопределить его в B, но при этом получить доступ к свойству B из A. Например:

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"
0 голосов
/ 21 июня 2010

Если я правильно понимаю, из класса A вы хотите получить доступ к функциональности текущего экземпляра через его конкретный тип B. Если член не доступен для A, потому что он не является общедоступным, определен в другой сборке и т. Д. Не нужно размышлять. Следующее будет работать, если код в классе A может видеть члены производного класса B.

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

Но это ставит под сомнение дизайн класса, потому что класс A не должен ничего знать о своих подклассах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...