Klasa rodzica

0

mam pytanie, czy da się w jakiś sposób pobrać klasę z której została wywołana dana funkcja?

Przykład:

new A();

class A
{
    private string Rodzic;
    public A()
    {
         this.Rodzic = "typ rodzica, czyli klasy A";
    }
}

inicjując klasę A, zapisuje sobie ona typ klasy z której została wywołana w postaci stringa.
I czy jest to w ogóle możliwe bez przekazywania żadnej zmiennej?

0

Takie coś?

using System;
using System.Diagnostics;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            new A().CallXFromA();
            new B().CallXFromB();

            Console.ReadLine();
        }
    }

    class A
    {
        public void CallXFromA()
        {
            new X().DoSomething();
        }
    }

    class B
    {
        public void CallXFromB()
        {
            new X().DoSomething();
        }
    }

    class X
    {
        public void DoSomething()
        {
            Console.WriteLine(new StackTrace().GetFrame(1).GetMethod().DeclaringType.Name);
        }
    }

}
0

tak o to, ale chciał bym otrzymać nazwę klasy która wywołała funkcje, a w tym przypadku mam kilka tych nazw w tabeli i nie mam jak sprawdzać który to numer, w twoim przypadku było to 1 ale to z tego co widzę jest zależne od ilości wywołanych funkcji

0

Jakie nazwy w tabeli, nie rozumiem?
Zrozumiałem, że chcesz pobrać nazwę klasy, która wywołała metodę. Możesz jaśniej sprecyzować?

0

new StackTrace().GetFrame**(1)**.GetMethod().DeclaringType.Name

tam gdzie jest pogrubione wpisujesz której z kolei klasy informacje chcesz dostać, tylko że może być dowolna ilość klas, i nie mam jak sprawdzić która to jest ta ostatnia

0

Nie z klasy, tylko z której metody. 0 zwróci Ci bieżącą metodę, 1 metodę wywołującą metodę 0, 2 metodę wywołującą metodę 1, itd.

Rozumiem, że Ty możesz z klasy A wywołać klasę B, z klasy B klasę C, a dopiero z C klasę X i w X chciałbyś mieć informację o tym, że całe to wywoływanie zaczęło się w klasie A?

Jeśli tak, to może w ten sposób?

using System;
using System.Diagnostics;

namespace ConsoleApplication8
{
    class Program
    {
        static void Main(string[] args)
        {
            new A().CallXFromA();
            new B().CallXFromB();
            new A().CallXFromBFromC();

            Console.ReadLine();
        }
    }

    class A
    {
        public void CallXFromA()
        {
            new X().DoSomething();
        }

        public void CallXFromBFromC()
        {
            new B().CallXFromC();
        }
    }

    class B
    {
        public void CallXFromB()
        {
            new X().DoSomething();
        }

        public void CallXFromC()
        {
            new C().CallXFromC();
        }
    }

    class C
    {
        public void CallXFromC()
        {
            new X().DoSomething();
        }
    }

    class X
    {
        public void DoSomething()
        {
            StackFrame[] frames = new StackTrace().GetFrames();

            int n = 0;
            for (int i = 0; i < frames.Length; i++)
            {
                if (frames[i].GetMethod().Name == "Main" && frames[i].GetMethod().DeclaringType.Name == "Program")
                {
                    n = i - 1;
                    break;
                }
            }

            Console.WriteLine(frames[n].GetMethod().DeclaringType.Name);
        }
    }

}
0

Napisz może do czego to potrzebujesz. Czy klasa, której nazwę chcesz uzyskać, jest powiązana hierarchią dziedziczenia z klasą, która tą metodę wywołuje?

0

ok, sry mój błąd, wkleiłem to przed inna funkcją i dlatego mi wyświetlało zła nazwę ;]
po prostu w funkcji pierwsze co muszę zrobić to pobrać ta nazwę i wszystko jest ok ;]
wielkie dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1