2014-03-28 12 views
5

Ich versuche, ein Objekt in einen generischen Typ zu konvertieren. Hier ist ein Beispiel Methode:Generische Art Conversions

void Main() 
{ 
    object something = 4; 
    Console.WriteLine(SomeMethod<int>(something)); 
    Console.WriteLine(SomeMethod<string>(something)); 
} 

public T SomeMethod<T>(object someRandomThing) 
{ 

    T result = Convert.ChangeType(someRandomThing, typeof(T)); 

    return result; 
} 

Dies gibt diesen Fehler:

Cannot implicitly convert type 'object' to 'T'. An explicit conversion exists (are you missing a cast?)

ich mehrere Varianten ausprobiert haben mein Ergebnis werfen als gattungs zu bekommen, aber es wird nicht jedes Mal ausarbeitet.

Gibt es eine Möglichkeit, diese Besetzung zu machen?

HINWEIS: In meinem realen Beispiel bekomme ich ein "Objekt" von einer gespeicherten Prozedur zurück. Die Methode könnte eine von mehreren gespeicherten Prozeduren aufrufen, so dass das Ergebnis eine Zeichenfolge oder ein Int (oder Long) sein könnte, abhängig davon, welcher Sproc aufgerufen wird.

+1

Sie sollten es vermeiden, sich in dieser Position zu allen möglichen Kosten setzen. Wenn Sie zwei Prozeduren aufrufen, die unterschiedliche Dinge zurückgeben, können Sie eine davon in einen Methodenaufruf umwandeln, der den Typ in den gewünschten Typ ändert, sodass Sie jederzeit wissen, um was für * den * Typ Ihrer Eingaben es sich handelt sind. – Servy

+0

@Servy - das mache ich. Bei der fraglichen Methode handelt es sich um eine geschützte Methode einer abstrakten Basisklasse zum Abstrahieren der Datenbankverrohrung. Die Public-Methode besteht aus mehreren Varianten, die wie GetNewWidgetId() aussehen und die geschützte Methode aufrufen. – Vaccano

+0

Anstatt die abstrakte Methode ein Objekt zurückgeben zu lassen, muss sie entweder eine Zeichenfolge oder ein int zurückgeben; eine der Implementierungen benötigt, um den Rückgabewert ihres DB-Aufrufs so zu ändern, dass sie von der Methode zurückgegeben werden muss. – Servy

Antwort

10

Convert.ChangeType kehrt das Objekt, so dass Sie das Ergebnis zurück auf eine T

T result = (T)Convert.ChangeType(someRandomThing, typeof(T)) 
+1

Ich bin sicher, dass das OP weiß, aber vielleicht eine Notiz hinzufügen möchten, dass Sie Ausnahmen behandeln sollten, wenn die Konvertierung nicht möglich ist. – Kevin

2

versuchen, diese werfen müssen:

return (T)Convert.ChangeType(someRandomThing, typeof(T)); 
Verwandte Themen