Reflection und Vererbung und statische Methoden

colblake

Erfahrenes Mitglied
Hallo,

ich habe folgendes Problem. Ich habe eine Basisklasse in der ich eine Membervariable habe die den Klassennamen der vererbenden Klasse ermitteln soll. Das funtioniert aber verständlicher weise nur wenn die Klasse instanziert wird. Bei einer Statischen Methode gibt die Methode den Klassenamen der Basisklasse zurück.

Hier der Code:
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace static_test
{
    class Program
    {
        static void Main(string[] args)
        {
            stTest.testStatic();
            new stTest().testMember();
            Console.ReadLine();
        }
    }
    
    /// <summary>
    /// 
    /// </summary>
    class stTestBase 
    {

        public static String aaa = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

        public stTestBase()
        {
            aaa = this.GetType().Name;
        }
    }

    /// <summary>
    /// 
    /// </summary>
    class stTest:stTestBase
    {
        public void testMember() 
        {
            Console.WriteLine("Member:\t" + aaa);
        }
        public static void testStatic() 
        {
            Console.WriteLine("Static:\t" + aaa);
        }
    }
}
Ausgabe:
Code:
Static:	stTestBase
Member:	stTest

Weiß jemand wie ich das für die statischen Methoden auch hin bekomme dass die ableitende klasse angezeigt wird?

gruß,
col.blake
 
Hallo,

Da wirst du nicht drum herum kommen in jeder abgeleiteten Klasse Code zu schreiben. Die einfachste Möglichkeit ist glaub ich in den abgeleiteten Klassen einen statischen Konstruktor zu schreiben der die initialisierung von aaa übernimmt.

C#:
class stTest : stTestBase
	{
		static stTest()
		{
			aaa = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;
		}

		public void testMember()
		{
			Console.WriteLine("Member:\t" + aaa);
		}
		public static void testStatic()
		{
			Console.WriteLine("Static:\t" + aaa);
		}
	}
 
Zuletzt bearbeitet von einem Moderator:
Hallo Steiner_B,

danke für Deine Antwort. Ich hab mir schon gedacht dass das nicht so einfach ist. Da ich ja faul bin, wollte ich ja genau das verhindern, dass jede ableitende Klasse nochmal angefasst werden muss.

Ich habe auch einen Ansatz gefunden, der aber ebenso nicht wirklich zufriedenstellend ist:

Code:
public class stTest<T>
    {
        protected static String aaa = typeof(T);
    }

class stTest : stTestBase<stTest>
    {
...
}
 
Zuletzt bearbeitet:
Deine Lösung funktioniert grundsätzlich auch, du müsstest halt die stTest wieder als Template-Klasse schreiben damit die Ausgabe für Klassen die von stTest ableiten auch noch stimmt.
Weniger Schreibarbeit ist sicher deine Lösung.
 

Neue Beiträge

Zurück