Laden...

[VB.Net] Generics und TryCast Frage

Erstellt von Floyd vor 16 Jahren Letzter Beitrag vor 16 Jahren 2.905 Views
Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren
[VB.Net] Generics und TryCast Frage

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!"

blog.freakfabrik.net

49.485 Beiträge seit 2005
vor 16 Jahren

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

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

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!"

blog.freakfabrik.net

49.485 Beiträge seit 2005
vor 16 Jahren

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

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

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!"

blog.freakfabrik.net

2.187 Beiträge seit 2005
vor 16 Jahren

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.

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

Danke JuyJuka, genau das hab ich gesucht 😁

"...denn wir arbeiten nicht nur um uns selbst zu verbessern, sondern auch den Rest der Menschheit!"

blog.freakfabrik.net

2.187 Beiträge seit 2005
vor 16 Jahren

Gern geschehen.
PS: Ich mag deinen Avatar 🙂

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

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!"

blog.freakfabrik.net

Floyd Themenstarter:in
85 Beiträge seit 2006
vor 16 Jahren

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!"

blog.freakfabrik.net