2016-05-19 8 views
1

Wenn ich eine FunktionWie finde ich den echten Typ, wenn Interface zurückgegeben wird?

public IEnumerable<string> GetStrings() 
{ 
    return new string[]{"all","my","strings"}; 
} 

Gibt es eine Möglichkeit haben, kann ich den „echten“ Typ des zurückgegebenen Wert (string []) bestimmen? Reflexion gibt mir:

Name: "IEnumerable`1" 
Namespace: "System.Collections.Generic" 
FullName: "System.Collections.Generic.IEnumerable`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]" 

Das Endziel ist es, ein Objekt dieser Art zu instanziiert, serialisiert sie und verwendet als Beispiel für api Entdeckung.

+2

Ohne diese Methode tatsächlich Aufruf (oder Analysieren von Quellcode), Sie können nicht die „echten“ zurückgegebene Wert herauszufinden, ich denke, . – Evk

+0

System.Typ type = GetStrings(). GetType(); – Master117

+0

Ah ja, mein Schlechter. – Master117

Antwort

2

Es ist so einfach.

var result = GetStrings();  
var returnType = result.GetType(); 

Es ist nicht möglich, den tatsächlichen Rückgabetyp ohne Aufruf der Methode zu erhalten. Was ist, wenn die Methode so ist?

Random random = new Random(); 
public IEnumerable<string> GetStrings() 
{ 
    var randomValue = random.Next(); 
    if (randomValue % 5 == 3) 
     return new string[] { "all", "my", "strings" }; 
    else if (randomValue > 15) 
     return new List<String>() { "all", "my", "strings" }; 
    else if (randomValue > 25) 
     return new HashSet<String>() { "all", "my", "strings" }; 

    return null; 
} 
+0

Ich denke, OP will das tun, ohne eine Methode selbst aufzurufen – Evk

+0

Yeas as @Evk sagt. Aber Ihr Beispiel macht deutlich, warum das unmöglich ist. Vielen Dank! – c0m4

1

Reflection werden Sie hier nicht helfen, es kann Ihnen nur sagen, was die Unterschrift des Verfahrens heißt es (in Ihrem Fall ein IEnumerable<string>) zurückgibt.

Ein Weg, um herauszufinden, ist die Methode aufzurufen und überprüfen Sie das zurückgegebene Objekt

var result = myInstance.GetString(); 
Console.WriteLine(result.GetType()); // System.String[] 
Verwandte Themen