Laden...

T Type dynamisch festlegen?

Erstellt von Crone vor 8 Jahren Letzter Beitrag vor 8 Jahren 2.490 Views
C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 8 Jahren
T Type dynamisch festlegen?

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.

3.003 Beiträge seit 2006
vor 8 Jahren

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)

502 Beiträge seit 2004
vor 8 Jahren

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

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

3.003 Beiträge seit 2006
vor 8 Jahren

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)

502 Beiträge seit 2004
vor 8 Jahren

...auch eine mögliche Interpretation der Frage 😉

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

3.003 Beiträge seit 2006
vor 8 Jahren

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.

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)

C
Crone Themenstarter:in
168 Beiträge seit 2010
vor 8 Jahren

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 😄

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.