Laden...

Generic - Prüfen auf Typ

Erstellt von LastGentleman vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.744 Views
LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren
Generic - Prüfen auf Typ

Hallo zusammen.

ich hab da eine generische Funktion und ich muss bei eine bestimmten Typ etwas anderes ausführen. Wie kann man herausfindet um welchen Typ es sich dabei handelt

Ich würde so was brauchen

if (typeof(T)==String)
{
}

Hat vielleicht einer eine Idee,

Besten Dank im Voraus
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

S
8.746 Beiträge seit 2005
vor 17 Jahren

Frage: Wozu das? Generischer Code muss mit jedem Typen funktionieren! Wozu also eine Abfrage? Ansonsten gibt es ja die Where-Klausel um die Typen einzuschränken. Dann wird auch zur Compile-Zeit geprüft und nicht erst zur Laufzeit.

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

Hallo svenson,

danke für deine Antwort ich habe da eine Funktion für Datenbanken, die generisch einstetzbar ist.

Wenn ich ein Objekt mit dem Int Wert, durch einen Cast in eine Variable vom Typ String umwandle, erzeugt er mir einen Fehler.

z.B.:


(string) 234  //Fehler

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

S
8.746 Beiträge seit 2005
vor 17 Jahren

Bei generischen Typen wirst du immer einen Fehler bekommen. Denn wenn du ein Objekt eines beliebigen Typen T hast, kann der niemals sicher gecastet werden.

In diesem Fall bleibt dir nur object.ToString() zu benutzen, oder eine Eingeschränkung zu machen, die die Konvertierung sicher erlaubt (das tut IConvertible):

public class MyGenericClass<T> where T:IConvertible{ }

Das geht nicht nur mit Klassen, sondern auch mit Funktionen:

public UInt32 MyMethod<T>(T t) where T : IConvertible
{
   return t.ToUInt32();
}
LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

In meinem Fall würde sich das leider nichts bringen schluchz, da das Interfact IConvertible die Methode toString() implementiert.

Werde eine eigene Funktion machen müssen.

Liebe Grüße
LastGentleman

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

S
8.746 Beiträge seit 2005
vor 17 Jahren

Original von LastGentleman
...da das Interfact IConvertible die Methode toString() implementiert.

??? Ich denke du willst nach String konvertieren?

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

ja schon aber leider ist, dass das Problem



(T) Var1
//kann nun beim Ausführen nach 
(string) 234  //Fehler
//werden

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

5.942 Beiträge seit 2005
vor 17 Jahren

Hallo LG

Du kannst per Cast keinen int zu einem String konvertieren.
Das gibt schon einen Fehler beim builden.
Verwende die .ToString() Methode dafür.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

T
512 Beiträge seit 2006
vor 17 Jahren

Nur um das nochmal festzuhalten, ein Cast ist keine Konvertierung.
Casts wandeln in der Regel nur in Typen um, die das Objekt ohnehin schon hat. Und das Objekt bleibt das Selbe. Eine Konvertierung erzeugt ein neues Objekt mit einem ganz anderen Typ aus den Informationen des ursprünglichen Objekts.

Du willst den Typ ja komplett Wechseln, also suchst du eine Konvertierung. Convert sollte da auch der passende Suchbegriff sein.

Und der generische Parameter ist hier auch völlig falsch eingesetzt. Generics sollten nicht den Polymorphismus ersetzen. Der würde hier völlig ausreichen.

Es gibt genau 4 Fälle in denen man zu einer generischen Methode greifen sollte:

  1. Der Typ wird für einen Rückgabewert benutzt, das erspart casten
  2. Man erstellt in der Methode eine Instanz von dem Typ ( new T() )
  3. Man muss typeof(T) aufrufen. Hier ist aber Vorsicht geboten. Wenn ein Parameter diesen generischen Typ benutzt ist es besser sich dort über parameter.GetType() den Typ zu holen, weil man da garantiert den echten Typ bekommt. Mit typeof(T) bekommt man bei falscher Benutzung eventuell nur eine Basisklasse, und damit vieleicht nicht die besten Informationen. (Wobei das ja auch Absicht sein könnte...)
    Außerdem sollte man mit typeof nicht den is Operator nachbauen.
  4. Man ruft selbst wieder generische Methoden auf, die den Typ brauchen.

Alles andere lässt sich über Polymorphismus (inklusive dem is Operator) äquivalent lösen und spart den Overhead von Generics. Zumindest fällt mir kein weiterer Grund ein, warum eine Funktion generisch sein sollte.

e.f.q.

Aus Falschem folgt Beliebiges

871 Beiträge seit 2005
vor 17 Jahren

Hallo,

zur Frage des OP:


if( typeof( T ) == typeof( string ))
{
	Console.Out.WriteLine( "Generic Type is string" );
}
else
{
	Console.Out.WriteLine( "Generic Type is NOT string" );
}

Grüsse, Egon

LastGentleman Themenstarter:in
1.274 Beiträge seit 2005
vor 17 Jahren

Vielen Danke an alle, die mit mir das Problem durchdacht haben. Das Codeschnipzel von egrath ist genau das was ich suchte

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein