Hallo Liebe C#'ler,
ich hoffe ihr könnt mir helfen.
Ich versuche eine eine Funktion umzubauen und dabei auf Generics zurückzugriefen. So wie die Funktion jetzt hiersteht funktioniert das auch, jedoch hätte ich gerne ein TryCast statt eines CTypes verwenden. Jedoch kommt dann immer die Meldung: ("'TryCast' operands must be class-constrained type parameter, but 'T' has no class constraint."
Eine zweite Frage hab ich auch noch. Wie kann ich überprüfen ob sich ein Objekt vom Type T in ein String-Objekt convertieren läßt damit ich die Trim-Funktion aurufen könnte.
Private Function getFieldValue(Of T)(ByVal objDS As DataSet, ByVal FieldName As String, ByVal row As UInt16) As T
If Not (objDS Is Nothing) AndAlso (objDS.Tables.Count = 1) AndAlso (objDS.Tables(0).Rows.Count >= row) Then
If Not objDS.Tables(0).Rows(row - 1).Item(FieldName).ToString.Trim = "" Then
Return CType(objDS.Tables(0).Rows(row - 1).Item(FieldName), T)
End If
End If
Return Nothing
End Function
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"
Hallo Floyd,
die Meldung sagt doch genau was Sache ist. Wenn du einen Cast verwenden willst, musst du per where-Bedingung von T fordern, dass T eine Klasse ist.
herbivore
Hi herbivore,
ich fang grade erst an mit Generics zu arbeiten. Kannst du mir mal ein Codestück zeigen das zeigt, wie die Zeile mit TryCast dann aussehen musst? Kann mir unter "where" nicht vorstellen. "Where" kenn ich nur aus SQL ^^
MFG
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"
Hallo Floyd,
kein Problem, wenn du die where-Syntax für Generics nicht kennst. Schau einfach in die :rtfm: Doku. Da sind - wie fast immer - natürlich auch Codebeispiele.
herbivore
Danke, jetzt weis ich was du meinst:
getFieldValue(Of T As Class)
was leider nicht das bringt was ich will.
Hmm also mal etwas ausführlicher:
Die Funktion "getFieldValue" ließt an einer bestimmten zeile, eine bestimmte Spalte aus einem Dataset.
Nun sollen Booleans als Booleans zurückgegeben weden, Strings sollen getrimmt und Zahlen als Zahlen zurückgegeben werden.
Ich könnte dafür jeweils eine eigene Funktion schreiben z.b.:
getFieldValueString
getFieldValueBoolean
getFieldValueNumeric
Jedoch hab ich gedacht das genau dafür Generics genau das richtige sein könnten.
Wie müßte ich das dann machen?
MFG
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"
Ich mach mal in C#, weil ich das besser kann als VB.NET:
public T GetFieldValue<T>(DataRow dataRow, string fieldName)
{
if(dataRow==null)
throw new ArgumentNullException(...);
if(dataRow.Table.Columns.Contains(fieldName))
throw new IndexOutOfRangeExcpetion(...);
T returnValue = null;
if(dataRow[fieldName]!=DBNull.Value)
{
returnValue = (T)dataRow[fieldName];
}
if(returnValue!=null)
{
if(T==typeof(string))
{
returnValue = (T)((string)returnValue).Trim())
}
// für die Anderen Typen auch überprüfen und eventuelle anpassungen machen.
}
return returnValue;
}
Davon kann man dan Überladungen machen, damit du die benötigte Signatur hast.
Danke JuyJuka, genau das hab ich gesucht 😁
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"
Gern geschehen.
PS: Ich mag deinen Avatar 🙂
Kann mir noch bitte einer sagen wieso ich hier eine Fehlermeldung bekommen.
returnValue = CType(CType(returnValue, String).Trim, T)
Value of type 'T' cannot be converted to 'String'
Ich habs mehrmals überprüft und der Code ist korrekt übersetzt.
Gruß Floyd
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"
Also ich hab ein mittel gefunden das Problem zu umgehen aber schön ist es nicht wirklick. Ich hoffe es hat jemand ne bessere Idee.
returnValue = CType(CType(CType(returnValue, Object), String).Trim, Object)
Gruß Floyd
"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"