Keine Boxen-oder type-parameter-Konvertierung für generische Typ-parameter
Habe ich folgende helper-Methode:
public static T CreateRequest<T>()
where T : Request, new()
{
T request = new T();
//...
//Assign default values, etc.
//...
return request;
}
Ich diese Methode verwenden möchten, die im inneren eine andere Methode in einem anderen Helfer:
public T Map<F, T>(F value, T toValue)
where T : new()
where F : new()
{
if (typeof(T).BaseType.FullName == "MyNamespace.Request")
{
toValue = MyExtensions.CreateRequest<T>();
}
else
{
toValue = new T();
}
}
Aber dann bekomme ich die Fehlermeldung:
Den Typ 'T' kann nicht verwendet werden, die als Typ-parameter 'T' im generischen Typ oder Methode " MyExtensions.CreateRequest()'. Es gibt keine boxing-Konvertierung oder type-parameter Konvertierung von 'T' zu 'MyNamespace.Anfrage'.
Gibt es eine Möglichkeit, wandeln Sie den Typ "T", so dass CreateRequest würde es verwenden ohne Probleme?
EDIT:
Ich weiß, ich kann zwei Dinge tun:
- lösen Sie Einschränkungen auf CreateRequest oder
- anziehen Constraints in der Karte.
Aber ich kann nicht den ersten, weil in CreateRequest ich die Benutzer Eigenschaften des Request-Klasse, und ich kann jetzt nicht die zweite, weil ich die anderen Arten (die nicht Erben aus Anfrage) mit Map-Funktion.
InformationsquelleAutor Lukasz Lysik | 2012-08-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für dieses Szenario müssen Sie lösen generische Einschränkungen der
CreateRequest
.Könnte es schmerzhaft werden, denn Sie verlieren compile-Zeit Prüfung dieser parameter.
Oder wenn Sie verwenden möchten
CreateRequest
Methode, die anderswo dann erstellen Sie nicht-generische überladung für dieses Szenario nur.(Request)(object)result;
schöner Fang mit der
.IsAssignableFrom
! viel besser als string-Vergleich!Dual-cast ist für den compiler, um ihm zu sagen, dass Sie wissen, was Sie tun, und Sie übernehmen Verantwortung für Sie. Ohne Sie es nicht funktionieren, und die, wenn Sie die oben sorgt dafür, dass dies funktionieren wird.
ah ja ... fast vergessen - es ist wahr, dass es keine Möglichkeit der direkten-cast
T
auf etwas anderes alsobject
🙂 aber Sie gehen konnteclass
und verwenden Sie dieas
-operator 🙂Ich Neige dazu zu verwenden, als nur, wenn es klappt von
if(sth != null)
- speichern cast, wo ich erwarte, dass Sie manchmal scheitern.InformationsquelleAutor Rafal
Haben Sie erklärt, dass die Art der
T
istRequest
imCreateRequest
Methode; auf der anderen verfügen, inMap
Methode, die Sie nicht über eine solche Einschränkung. Versuchen Sie, die Erklärung derMap
:Dann können Sie versuchen, entfernen-Anforderung-Einschränkung von CreateRequest Funktion.
InformationsquelleAutor daryal