Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Klasse anhand übergebener Parameter instanzieren [==> Generics]
padde77
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

Klasse anhand übergebener Parameter instanzieren [==> Generics]

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Coffeebean
myCSharp.de - Team

Avatar #avatar-3295.gif


Dabei seit:
Beiträge: 2.206
Herkunft: Deutschland/Schweiz

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
padde77
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.778
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
padde77
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
pdelvo
myCSharp.de - Member

Avatar #avatar-3354.png


Dabei seit:
Beiträge: 1.346

beantworten | zitieren | melden

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;
        }
    }
private Nachricht | Beiträge des Benutzers
padde77
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15.482

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 6.778
Herkunft: Waidring

beantworten | zitieren | melden

Hallo padde77,

dazu hast du mehrere Möglichkeiten:

1) du erstellst ein Mapping mit einem Dictionary<string, IRechner> und liest dann von dort den IRechner aus (vom pdelvos Beispiel)

2) 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.

3) ...

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!"
private Nachricht | Beiträge des Benutzers
padde77
myCSharp.de - Member



Dabei seit:
Beiträge: 50

Themenstarter:

beantworten | zitieren | melden

OK,

ich werde es mal versuchen.

Vielen Dank!
private Nachricht | Beiträge des Benutzers