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
T Type dynamisch festlegen?
Crone
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

T Type dynamisch festlegen?

beantworten | zitieren | melden

Hallo zusammen,

ich habe eine Klasse die wie folgt aussieht:

    public class NetworkArgs<T> : EventArgs
    {
        public T Message;

        public NetworkArgs(T Message)
        {
            this.Message = Message;
        }
    }

Nun hätte ich gerne eine Liste in dieser sollen verschiedene (T's) Typen gespeichert werden


Anschließend möchte ich eine neue Instanz von NetworkArgs erzeugen mit einen Typen aus der vorher erstellten List.

Ist das möglich, wenn ja wie?

ich habe es bereits mit einige Datentypen versucht, jedoch ohne erfolgt.
Auch habe ich versucht die Datentypen einfach als object zu speichern und später mit typeof zu ermitteln, jedoch ohne erfolg.
Real programmers don't comment their code - it was hard to write, it should be hard to understand.
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Du hast Generics nicht richtig verstanden.

Generische Klassen / Methoden sind eine Methode, Typen zur Compile-Zeit festzulegen.
Du möchtest das erst zur Laufzeit tun und solltest daher lieber in Richtung Reflection nach einer Lösung suchen.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

Die Einwende von LaTino sind natürlich korrekt - aber wenn ich Dich richtig verstanden habe, sollte es dennoch möglich sein...

 public abstract class NetworkArgs : EventArgs
    {
        public abstract Type DataType { get; }                
    }

    public class NetworkArgs<T> : NetworkArgs
    {
        public T Message;

        public NetworkArgs(T Message)
        {
            this.Message = Message;
        }

        public override Type DataType
        {
            get
            {
                return typeof(T);
            }
        }
    }

Deine Liste wird dann natürlich eine List<NetworkArgs>

Bart Simpson

[Edit:]
P.S. Die Stichworte Type.MakeGenericType und Activator.Createinstance sollten Dich auf den richtigen Weg bezgl. des zweiten genannten Problems bringen...
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Mr. Bart Simpson am .
Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Hm, ich hatte ihn so verstanden:


public class Client()
{
     public void CreateNetworkArgs() 
     {
           List<Type> typeList = new List<Type> { typeof(int), typeof(Guid), typeof(string) };
           
           //und jetzt, Zitat: "neue Instanz von NetworkArgs erzeugen mit einen Typen aus der vorher erstellten List."
           NetworkArgs newGuidNetworkArgs = new NetworkArgs<typeList[1]>(Guid.Empty);
     }
}


Und dieses Ansinnen ist mit Generics nicht möglich, denn, wie gesagt, auch generische Typen muessen zur Compilezeit festliegen.

LaTino
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Mr. Bart Simpson
myCSharp.de - Member

Avatar #avatar-3273.gif


Dabei seit:
Beiträge: 502
Herkunft: Mittelfranken

beantworten | zitieren | melden

...auch eine mögliche Interpretation der Frage ;-)
Zitat von LaTino
Und dieses Ansinnen ist mit Generics nicht möglich, denn, wie gesagt, auch generische Typen muessen zur Compilezeit festliegen.LaTino

Das ist zwar im Prinzip richtig, aber dennoch kannst Du (natürlich ohne Typsicherheit) mit Type.MakeGenericType und Activator.Createinstance Instanzen dynamisch erstellen - auch von generischen Typen.

Bart Simpson
Praxis ist wenn alles funktioniert und keiner weiss warum.
Theorie ist wenn man alles weiss, aber nichts funktioniert.

Bei uns wird Theorie und Praxis vereint: Nichts funktioniert und keiner weiss warum...
private Nachricht | Beiträge des Benutzers
LaTino
myCSharp.de - Experte

Avatar #avatar-4122.png


Dabei seit:
Beiträge: 3.003
Herkunft: Thüringen

beantworten | zitieren | melden

Zitat von Mr. Bart Simpson
Das ist zwar im Prinzip richtig, aber dennoch kannst Du (natürlich ohne Typsicherheit) mit Type.MakeGenericType und Activator.Createinstance Instanzen dynamisch erstellen - auch von generischen Typen.
Zitat von LaTino
Du möchtest das erst zur Laufzeit tun und solltest daher lieber in Richtung Reflection nach einer Lösung suchen.

Schrieb ich ja.

LaTino
(leicht OT: in 99% der Anwendungen wird Reflection benutzt, um kaputte Designs zu retten. Da das auf Dauer sowieso nicht gut geht -> Problem neu denken)
"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)
private Nachricht | Beiträge des Benutzers
Crone
myCSharp.de - Member



Dabei seit:
Beiträge: 168

Themenstarter:

beantworten | zitieren | melden

Danke für die Antworten.

Ich hab es nun so gemacht wie es eigentlich sein sollte, Ich nutze object und Konvertieren nun immer entsprechend selbst, damit bin ich Typ sicher muss aber immer in den Funktionen Konvertieren.

die Interpretation von Latino ist Korrekt genau das wollte ich erreichen :).

Type.MakeGenericType und Activator.Createinstance hab ich mir auch angeschaut und ist tatsächlich eine Möglichkeit, jedoch gefällt mir die noch weniger als alles manuell zu Konvertieren :D

Danke für eure Vorschläge

Gruß
Crone
Real programmers don't comment their code - it was hard to write, it should be hard to understand.
private Nachricht | Beiträge des Benutzers