2017-01-24 2 views
1

I Objekte wie folgt definiert:Holen Bezug auf ein generisches Objekt <T>

public class ModelList<T> : ModelBase, IModelList<T>, IModelList 
where T : IModelListItem, new() 
{ 
    public void Method1() 
    { 
    // do work here! 
    } 
} 

public class Object1 : ModelListItem 
{ 
} 

public class Object2 : ModelListItem 
{ 
} 

public class Objects1: ModelList<Object1>, IModelList 
{ 
} 

public class Objects2: ModelList<Object2>, IModelList 
{ 
} 

Irgendwo im Code weit weit weg habe ich eine Methode, die eine Sammelobjekt entweder Objects1 oder Objects2 erhalten. Gibt es eine Möglichkeit, Method1 von hier aus aufzurufen?

private void DoSomething(object O) 
{ 
    // O can be either Objects1 or Objects2 
    O.Method1(); 
} 
+0

In Java können Sie Geräte C# überprüfen etwas ähnliches haben. – danny117

+0

@ danny117: Ich glaube nicht, dass Javas "implements" etwas damit zu tun haben, was das OP verlangt; Können Sie ein Beispiel zeigen, wie Sie das Problem in Java mit 'implements' lösen würden? –

+0

In Java können Sie überprüfen, ob eine Klasse eine Schnittstelle implementiert. Wenn dies der Fall ist, können Sie die implementierte Methode sicher aufrufen. Weit entfernt, wenn Sie überprüfen, ob die Schnittstelle implementiert ist, können Sie die Methode sicher aufrufen. – danny117

Antwort

2

Da das Verfahren nach Art überhaupt nicht davon ab, Sie Method1()-IModelList hinzufügen könnte und dass auf die Funktion in geben.

public interface IModelList 
{ 
    void Method1(); 
} 

wie

verwendet
private void DoSomething(IModelList o) 
{ 
    // o can be either Objects1 or Objects2 or anything else that implments IModelList 
    o.Method1(); 
} 
+0

Das ist ein guter Vorschlag, aber es sollte beachtet werden, dass es nur anwendbar ist, wenn das OP die Kontrolle über 'IModelList' und die damit verbundenen Typen hat.Da sie sagen, dass der Code, den sie gerade schreiben, "weit weg" ist, kann dies nicht unbedingt als selbstverständlich betrachtet werden. –

+0

Vielen Dank, die Methode an die Schnittstelle zu bewegen funktioniert GROSS !! Arbeitet noch an meinem OOP-Skillset. –

5

Gibt es eine Möglichkeit Method1 von hier zu nennen?

Es ist: Machen Sie Ihre weit weg Methode generic:

private void DoSomething<T>(ModelList<T> o) 
    where T : IModelListItem, new() 
{ 
    o.Method1(); 
} 
+0

Dies ist wahrscheinlich der Weg zu gehen, aber ich konnte nicht herausfinden, die Syntax zu werfen Objects1 oder Objects2 auf den entsprechenden Typ beim Aufruf dieser generischen DoSomething-Methode. –

+0

@NerdherderEd: Es ist nicht notwendig, etwas zu werfen. Es sollte funktionieren, indem Sie einfach den Elementtyp weiterleiten: 'DoSomething (new Objects1());' Wenn Sie Glück haben, könnte der Compiler sogar das type-Argument ableiten. In diesem Fall können Sie es überspringen: 'DoSomething (new Objects1()); ' –

+0

Die Methode public void WorkOnCollection (Objekt O) arbeitet mit Objects1 & 2 kennt den Typ der Objekte in diesen Sammlungen nicht, sie könnten Sammlungen von Object1 oder Object2 sein. Der Methodenaufruf DoSomething (O) bewirkt, dass der Inline-Compiler in VS2015 die Nachricht bellt: 'DoSomething (ModelList )' kann nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben. –

Verwandte Themen