Hi,
ist es möglich, dass ich eine Klasse mit new instanziere, welche als Namen den Parameter eines Aufrufs hat.
Beispiel:
rechne(addiere,1,4)
public string rechne (??? typ, int zahl1, int zahl2){
statt:
if (typ == "addiere"){
addiere calc = new addiere();
}
hätte ich gerne sowas:
typ calc = new typ();
}
Sonst werden die if´s immer länger.
Geht sowas?
Vielen Dank
Padde
Hallo padde77,
wieso machst du nicht eine Rechne-Klasse und machst die Methode "Addieren" von aussen erreichbar?
Dann hast du
Rechne rechne = new Rechne();
int ergebnis = rechne.addieren(1,4);
Ist das das, was du willst?
Gruss
Coffeebean
Microsoft MVP // Me // Blog // GitHub // @Egghead // All my talks // Speakerdeck
Hi nochmal,
nein, das möchte ich genau vermeiden, da die Klassen "universal" sein sollen, also jeder 1. Parameter von rechne() soll eine entsprechende Klasse instanzieren.
Danke padde
Hallo padde77,
machs generisch mit der Typeinschränkung new(), dann kannst du schreiben:
public string Rechne<T> (int zahl1, int zahl2) where T : new()
{
T calc = new T();
}
Sonst könntest du dir Dependency-Injection, das Strategie-Muster anschauen od. einen Delegaten übergeben.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Hi gfoidl,
da sieht nicht schlecht aus, da versuch ich mal.
Nur mit den Delegates steig ich noch nicht so durch...
Danke, ich melde mich wieder.
Padde
Wie wäre es mit einfachen Generics?
class Program
{
static void Main(string[] args)
{
double d1 = 10.0, d2 = 15.0;
double result1 = Rechner.Rechne<Addierer>(d1, d2); // 25
double result2 = Rechner.Rechne<Subtrahierer>(d1, d2); // -5
}
}
public static class Rechner
{
public static double Rechne<T>(double input1, double input2) where T : IRechner, new()
{
T rechner = new T();
return rechner.Rechne(input1, input2);
}
}
public interface IRechner
{
double Rechne(double input1, double input2);
}
public class Addierer : IRechner
{
public double Rechne(double input1, double input2)
{
return input1 + input2;
}
}
public class Subtrahierer : IRechner
{
public double Rechne(double input1, double input2)
{
return input1 - input2;
}
}
Hi nochmal,
also, ich habs wie gfoidl erstellt, klappt.
Rechne<T> (int zahl1, int zahl2);
T kommt allerdings aus einem Menüaufruf, welchen ich mit
e.Item.Name
abfrage.
e.Item.Name = addiere;
nur kennt VS das e.Item.Name nicht.
Gibt es einen Aufruf in der Art:
Rechne<e.Item.Name as IRGENDWAS> (int zahl1, int zahl2);
oder ähnliches?
Danke
padde
Wir rutschen solangsam in die Richtung der Grundlagen von C#
Siehe auch [Hinweis] Wie poste ich richtig? 1.1 und 1.1.1
Natürlich kannst Du aus einem Menü entsprechend Casten oder Mappen.
Auf dem Präsentierteller wird Dir aber auch VS nicht alles anbieten - ein wenig denken und nachschauen musst dann schon auch selbst.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hallo padde77,
dazu hast du mehrere Möglichkeiten:
du erstellst ein Mapping mit einem Dictionary<string, IRechner> und liest dann von dort den IRechner aus (vom pdelvos Beispiel)
du holst dir mittels Type.GetType aus dem String den Typ und erstellst dann mittels Activator.CreateInstance das Objekt und castest es auf IRechner
Also eine Factory, die das Erstellen übernimmt.
...
Ich würde erstere Möglichkeit nehmen.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"