2016-06-27 6 views
0

sei angenommen, daß Klassen (B) 's öffentliche Funktion hat die Rücklaufleitung:interne Klasse maskierte durch Objekt

return (object)(new List<A>{Some elements}) 

wobei A eine interne und versiegelte Klasse ist. Ich kann den Code von A oder B nicht ändern.

Nachdem ich diese Funktion in B aufgerufen habe, wie finde ich das erste Element dieser Liste. C# lässt mich diese Liste nicht in List<A> umwandeln, weil A intern ist.

+0

Was ist Ihre Frage? – Andrey

+0

Wie lautet die Methodensignatur der öffentlichen Methode in B, die die Liste zurückgibt? – adv12

+0

@Andrey "Nachdem ich diese Funktion in B aufgerufen habe, wie finde ich das erste Element dieser Liste." – user2770287

Antwort

1

Sie können eine generische Liste in das nicht generische IEnumerable umwandeln, darüber iterieren und dann Object.ToString() verwenden, um Informationen zu den B-Instanzen abzurufen, oder Sie können die Referenz einfach zurückgeben.

Object obj = new List<string>() { "dd", "ee" }; 
IEnumerable enumerable = obj as IEnumerable; 
bool foundSomething = false; 
foreach (var thing in enumerable) 
{ 
    if(!foundSomething) 
    { 
     // Console.Write(thing.ToString()); If you want 
     foundSomething = true; 
     return thing; 

    } 
} 
1

Vielleicht bin ich Missverständnis die Frage hier, aber wenn A abgedichtet ist, können Sie immer noch eine Erweiterungsmethode zu wiederholen oder zu handhaben die Liste schreiben.

Extension methods for sealed class in c#

2
  1. Nur weil Sie den Quellcode oder zerlegen Sie den Code lesen können, sollten Sie auf der aktuellen Implementierung nicht verlassen, sondern versuchen, die öffentliche Schnittstelle zu verwenden.

  2. List<A> implementiert die nicht generische IList, so dass Sie wieder zu IEnumerable oder IList werfen können, wenn Sie wirklich für Probleme suchen.

1

Sie Schnittstelle Kovarianz IEnumerable<object> werfen können und dann LINQ einige Erweiterungsmethoden verwenden:

var aItems = (IEnumerable<object>) B.Foo(); 
Console.WriteLine(aItems.First()); 
1

erstes Element zu erhalten, ohne etwas zu berühren, dies zu tun:

object result = b.MethodThatReturnsList(); 
object firstEl = ((IList)result)[0]; 

Problem ist, dass firstEl Variable kann nur object sein, und Sie können es nicht in A werfen, weil es nicht zugänglich ist. Nicht sehr hilfreich, obwohl.

Hier ist das eigentliche Problem: Sie können keine öffentlichen Methoden deklarieren, die einige private/interne Typen zurückgeben. Sie erhalten this compilation error.

Die Lösung besteht darin, eine öffentliche Schnittstelle zu entwerfen, die A implementiert und List<IYourInterface> zurückgibt. Eine andere Option ist die öffentliche Basisklasse.