2016-01-14 17 views
6

Ich habe viele Fragen durchgesehen, die ähnlich sind, aber keiner von ihnen hat wirklich berührt, was ich genau machen möchte. Was ich versuche zu tun ist, von einer externen Quelle eine Liste von Variablen lesen, die auch ihre Datentyp in ein String-Array umfassen:Methode mit mehreren Rückgabetypen

Beispiel: Das sind Objekte in einem Wörterbuch

ID/Key  Type Value/Data; 
varName1 bool true; 
varName2 string str; 
varName3 int  5; 

speichere ich dann als Objekte mit mehreren Strings, wobei die ID auch als Schlüssel dient.

Ich möchte jetzt eine Methode erstellen, die eine switch-Anweisung verwendet, die die Zeichenfolge in den richtigen Datentyp konvertiert und sie zurückgibt, ohne dass beim Methodenaufruf irgendetwas angegeben werden muss. Die Funktion sollte wie folgt aussehen:

public ??? Method(string key) 
{ 
    if(dictionary.ContainsKey(ID)) 
    { 
     Var temp = dictionary[ID]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

Der Methodenaufruf wie folgt aussehen sollte: Ich habe etwas verpasst

int x = Method(string key); 
string word = Method(string key); 
boolean isTrue = Method(string key); 

Vielleicht, aber ich habe noch etwas zu finden, die wirklich etwas tut, ganz so was. Alle Gedanken darüber sind ebenfalls willkommen.

+2

Sorry, keine solche Sache in C#. Eine Methode hat einen festen Rückgabetyp. Sie könnten 'object' als Rückgabetyp verwenden, aber Sie müssen ihn umwandeln. – adv12

+1

Sie müssten die Methode generisch machen, damit sie funktioniert. Und es würde am Ende aussehen wie "string word = Methode (Schlüssel)", wenn Sie es verwendet haben. Außerdem müsstest du 'bool?' Und 'int?'da Sie' null' zurückgeben wollen, wenn der Schlüssel nicht gefunden wird. – juharr

+0

Wenn Ihre Werte als "Objekt" gespeichert wurden, können Sie '(T) value' verwenden. Was hält Sie von 'string word = (string) Methode (string key);', gegeben, Methode gibt 'object' zurück –

Antwort

6

Der Compiler hat keine Möglichkeit, zwischen den drei Verfahren zur Unterscheidung von Anrufen Sie haben zur Verfügung gestellt, weil sie alle aussehen Method(key);

Eine Option ist ein object und dann erwarten, dass der raubend Code zurück es zu dem, was werfen sie wollen:

public object Method(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
    { 
     var temp = dictionary[key]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

... 

int x = (int) Method(key); 
string word = (string) Method(key); 
bool isTrue = (bool) Method(key); 

Sie auch die dynamic Schlüsselwort verwenden könnte die Besetzung implizit zu machen:

public dynamic Method(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
    { 
     var temp = dictionary[key]; 

     switch (temp.Type) 
     { 
      case "bool": 
       return Convert.ToBoolean(temp.Value); 

      case "int" 
       return Convert.ToInt(temp.Value); 

      case "string" 
       return temp.Value; 
     } 
    } 

    return "NULL"; 
} 

... 

int x = Method(key); 
string word = Method(key); 
bool isTrue = Method(key); 

dynamic ist jedoch ein sehr mächtiges Konzept, und es ist leicht für sie außer Kontrolle geraten, so dass Sie wirklich vorsichtig damit sein müssen.

Es scheint mir, dass Sie erwarten, dass Ihr aufrufender Code weiß, welcher Objekttyp für jeden Schlüssel erwartet wird. Es scheint, wie vielleicht der beste Ansatz ist, einfach die Versorgung Benutzer zu lassen, dass Informationen:

public T Method<T>(string key) 
{ 
    if(dictionary.ContainsKey(key)) 
     return (T) Convert.ChangeType(dictionary[key].Value, typeof(T)); 
    return default(T); 
} 

... 

int x = Method<int>(key); 
string word = Method<string>(key); 
bool isTrue = Method<bool>(key); 

Auf diese Weise gibt es keine Notwendigkeit den Wert Typen in Ihren Wörterbuch Objekten in erster Linie zu verfolgen.

+1

Ich weiß, dass das OP 'boolean' verwendet, aber in C# ist es' bool' oder 'Boolean'. – juharr

+0

@juharr: Richtig, danke. – StriplingWarrior

+0

Ähnlich wie in OP ist 'Var' in C# ungültig, sollte' var' sein. –

0

Der Rückgabetyp einer Funktion muss eingegeben werden. Wie bei jeder anderen Variablen oder Operation ist jeder Typ, der vom angegebenen Typ erbt, ein gültiger Rückgabewert (weshalb Objekt alles als Wert zulässt).

persönlich nicht ich denke, dass es nützlich ist, ein Verfahren mit mehreren Rückgabetypen zu machen, aber wenn Sie wirklich ein Verfahren mit mehreren Rückgabetypen haben wollen, können Sie den dynamic Typen in .NET 4.0 verwenden:

private static void Main(string[] args) 
    { 
     int x = Method("varName3"); 
     string word = Method("varName2"); 
     bool isTrue = Method("varName1"); 
    } 

    private static dynamic Method(string key) 
    { 
     var dictionary = new Dictionary<string, KeyValuePair<Type, object>>() 
     { 
      { "varName1", new KeyValuePair<Type, object>(typeof(bool), false) }, 
      { "varName2", new KeyValuePair<Type, object>(typeof(string), "str") }, 
      { "varName3", new KeyValuePair<Type, object>(typeof(int), 5) }, 
     }; 

     if (dictionary.ContainsKey(key)) 
     { 
      return dictionary[key].Value; 
     } 

     return null; 
    } 

Hoffe es hilft

+0

Hat mir wunderbar geholfen, aber ich bin leider auf das 3.5 Framework beschränkt. Hintergrund: Dies ist ein Tool für Benutzer von Unity. –

+0

Wenn Sie auf .NET 3.5 beschränkt sind, würde ich versuchen, die Methode generisch zu machen: int x = Methode ("varName3"); Bitte werfen Sie einen Blick auf die Antwort von StriplingWarrior. – Sneijder

Verwandte Themen