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.
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.
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))
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.
Danke, ich bekomme immer noch einen Fehler mit dem convert.chaneType mit diesem – chrisblue13
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? –
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)
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;
danke. Ich dachte das auch, aber es mag es nicht – chrisblue13
Ist es ein Tippfehler 't.GetType(). Name'? Es sollte nur 't.Name' sein –
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
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