2016-07-22 7 views
0

Ich versuche, einen generischen Methodenparameter in seinen Typ zu konvertieren. Der Compiler sagt, dass ich es nicht umwandeln kannGenerische T in Typ C konvertieren #

Jede Hilfe mit diesem würde geschätzt werden.

+0

Ist es ein Tippfehler 't.GetType(). Name'? Es sollte nur 't.Name' sein –

+5

Generische Typen, die anschließend den konkreten Typ ihrer Typparameter testen und ihr Verhalten mit einer Reihe von Bedingungen ändern, die auf dem Typ *** basieren, sollten nicht generisch sein ***. Es ist ein Missbrauch in allen, bis auf wenige Fälle. – spender

+2

Ihr Code würde erheblich verbessert werden, indem Sie einfach eine Überladung mit der Signatur 'public ProvideRequest ProvideRequest (int numberOfLines, string ServiceType, GoldAddressKeyIdentifierType addressIdentifier) ​​erstellen, um mit typspezifischen Aktionen umzugehen und die Switch-Idee aufzugeben. Sie werden mit stärkeren Typ-Checks und Code, der leichter zu debuggen ist, enden. – spender

Antwort

2

Das Problem ist, dass beim Aufruf t.GetType() Sie nicht den generischen Typ, sondern einfach System.Type erhalten, was der Laufzeittyp von t ist. Was Sie stattdessen wollen, ist der Name der gattungsgemäßen Art, die Sie über bekommen kann:

switch(typeof(T).Name) 

Außerdem Name gibt einen String zurück, so dass Sie Ihre cases schreiben wie folgt:

case MyNamepscae.GoldAddressKeyIdentifierType: 

aber ich Ich würde dringend empfehlen, keine Typnamen zu verwenden, sondern nur den eigentlichen Typ zu aktivieren. Doch die switch Aussage erlaubt nur Strings, so stattdessen eine if verwenden:

if(typeof(T) == typeof(GoldAddressKeyIdentifierType)) 
1

ich zu vergleichen empfehlen zwei Types:

... 

    if (typeof(T) == typeof(GoldAddressKeyIdentifierType)) 
    provideRequest.RequestIdentifier = 
       Convert.ChangeType(addressIdentifier, typeof(GoldAddressKeyIdentifierType)); 

    return provideRequest; 

jedoch Generika (<T>) als generische Art arbeiten, eine spezielle Bedingungen sind schlechte Parctice.

+0

Danke, ich bekomme immer noch einen Fehler mit dem convert.chaneType mit diesem – chrisblue13

+0

nach https://msdn.microsoft.com/en-us/library/dtb69x08 (v = vs.110) .aspx 'GoldAddressKeyIdentifierType' sollte' IConvertible' implementieren. Ist es so? Was ist der Fehler dann? –

1
Type t = typeof(T); // type of T 
    switch (t.GetType().Name) 

Dieser Schalter ist wahrscheinlich ein Fehler. t ist vom Typ Typ. Also t.GetType() ist System.RuntimeType, also t.GetType(). Name ist immer "System.RuntimeType", den du kennst.

Soweit ich Ihr Problem zu verstehen, müssen Sie .GetType() zu entfernen, Sie

switch(t.Name) 
1

benötigen Da Sie wissen, dass es vom Typ GoldAddressKeyIdentifierType ist, sollten Sie in der Lage, das Objekt als die Klasse zu werfen in Ihrem Fall Methode

provideRequest.RequestIdentifier = (GoldAddressKeyIdentifierType)addressIdentifier; 
+0

danke. Ich dachte das auch, aber es mag es nicht – chrisblue13

Verwandte Themen