dynamisch auf variable zugreifen
-
Hi
ich erstelle dynamisch eine Klasse deren Klassenname erst zur Laufzeit bekannt ist. Später möchte ich auf eine public static Variable der Klasse zugreiffen.
Bsp:
1. Durchlauf: XYZ.meineVariable
2. Durchlauf: JKL.meineVariable
...Ich brauche diese später in einer Methode. Die grundsätzliche Idee sieht so aus:
public void testeDynamischeKlasse(String klassenname){
var myTempValue = klassenname.meineVariable;
}..natürlich geht das nicht, weil "klassenname" ein String Objekt ist, und kein Objekt der dynamisch erstellten Klasse. Theoretisch brauche ich auch gar kein Objekt der Klasse, da die Variable public static ist.
Aus dem Java kenne ich die Funktion ClassForName, welche sowas ermöglicht soviel ich weiss, is aber auch schon ne Weile her..
Wie realisiert man sowas in C#, Jemand ne Idee?
Grüsse
guest10111110
-
Reflection
-
Hallo,
wie erzeugst du denn dynamisch die Klasse?
Man kann per Reflection dynamisch auf eine Klasse bzw. ein Klassenobjekt zugreifen: MethodInfo, PropertyInfo bzw. FieldInfo.
-
Hi
danke für die schnellen Antworten!
Die Klasse welche ich erzeuge, ist ein Abbild einer Datenbank Tabelle (Schema)
Die Klasse heisst gleich wie die Tabelle und diese wird erst zur Laufzeit bekannt.Danke für die Stichwörter, ich werd mich mal schlau machen!
Gruss guest10111110
-
Hi
ich komm nicht drauf. Ich benötige folgende Zuweisung:
var myObjects = ClassA.ClassB.ClassC.getObjects()Das einzige was ich habe, sind die Namen der ClassA, B, und C.
Einen einfachen Aufruf krieg ich nach diesem Schema hin:
using System; using System.Reflection; class Program { static void Main() { Type t = Type.GetType("Foo"); MethodInfo method = t.GetMethod("Bar", BindingFlags.Static | BindingFlags.Public); method.Invoke(null, null); } } class Foo { public static void Bar() { Console.WriteLine("Bar"); } }
aber wie muss ich vorgehen wenn ich einen Aufruf durch mehrere Unterklassen bewerkstelligen möchte?
Grüsse
guest10111110
-
Servus,
mal 2 kleine Beispiele:
public class ClassA { public class ClassB { public class ClassC { public ClassC() { } public static void Foo() { // Mach was!!! } } public ClassB() { } } public ClassA() { } } private void Beispiel1() { string className = "ClassC"; string methodName = "Foo"; Assembly mainAssembly = Assembly.GetExecutingAssembly(); Type[] classTypes = mainAssembly.GetTypes(); if ( classTypes == null ) return; Type classType = null; foreach ( Type type in classTypes ) { if ( type.Name == className ) { classType = type; break; } } if ( classType == null ) return; MethodInfo methodInfo = classType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); if ( methodInfo != null ) methodInfo.Invoke(null, null); } private void Beispiel2() { // Fullname string className = "Namespace.ClassA+ClassB+ClassC"; string methodName = "Foo"; Assembly mainAssembly = Assembly.GetExecutingAssembly(); Type classType = mainAssembly.GetType(className); if ( classType == null ) return; MethodInfo methodInfo = classType.GetMethod(methodName, BindingFlags.Static | BindingFlags.Public); if ( methodInfo != null ) methodInfo.Invoke(null, null); }
Für dieses Problem gibts noch weitere Lösungsansätze. Ist nicht so ganz einfach aber Beispiele findest du mit Google eigentlich genug.
gruß
Hellsgore
-
Hi Hellsgore
great!! oder wie man bei Google neuerdings sagt: +1
Gruss guest10111110