2016-08-31 2 views
0
public class Bus : IPresentable 
{ 
    public string Name { get; set; } = "Bus"; 
    public int ID { get; set; } = 12345; 

    //******** IPresentable interface ***************// 
    public int LocX { get; set; } 

    public int LocY { get; set; } 
} 

Schnittstelle:Gibt es eine Möglichkeit, in Runtime zu sagen, ob eine Klasseneigenschaft von einer Schnittstelle kommt?

public interface IPresentable 
{ 
    int LocX { get; set; } 
    int LocY { get; set; } 
} 

in meiner Anwendung:

Bus bus = new Bus(); 
bus.LocX = 10; // is there a way to tell that this comes from interface 
bus.Name = "New Name" ; // but this is not ? 
+0

Eigenschaften kommen nicht wie von einer Basisklasse aus einer Schnittstelle. Eine Schnittstelle ist nur ein Vertrag. Wenn eine Klasse eine Schnittstelle implementiert, sagt sie nur "Ich stimme zu, die Vertragsbedingungen dieser Schnittstelle zu erfüllen". Sie wissen also, dass 'Bus' eine 'LocX'-Eigenschaft hat. Versuchen Sie nur zu bestimmen, ob 'Bus'' IPresentable' implementiert? Wenn ja, müssen Sie nur 'typeof (IPresentable) .IsAssignableFrom (typeof (Bus))' – itsme86

Antwort

4

Reflexion verwenden, können wir die Bus Klasse abfragen und die Liste der Namen der Eigenschaften abzurufen, dass „gehören“ sowohl auf die Klasse und alle Schnittstellen, die es möglicherweise implementiert:

Das Ergebnis interfaceProperties ist ein IEnumerable<string>. In diesem Fall würde es enthalten:

LocX 
LocY 

Sie können die Liste für die Eigenschaften überprüfen, die Sie möchten.

IMO, dies ist eine teure Möglichkeit, Ihre Klassen für diese Informationen zu befragen. Vielleicht mit mehr Hintergrund über warum Sie dies tun möchten, könnte eine bessere Alternative produziert werden.

+0

Das ist gut, aber ich bin tatsächlich auf der Suche nach dem Gegenteil, ich möchte die Schnittstelleneigenschaften ausziehen und nur die Nicht-Schnittstelle Eigenschaften aufrufen . – Pacman

+1

@Pacman: Dann würden Sie einfach '.Intersect()' in '.Except()' ändern, was 'ID' und' Name' ergeben würde. –

+0

Sie können auch http://stackoverflow.com/questions/3285392/matching-an-interfaces-properyinfo-with-a-classs-propertyinfo für die richtige Schnittstelle überprüfen - zum Methoden-Mapping (dh Schnittstelle hat vielleicht gerade, aber klasse beide bekommen/setzen). –

Verwandte Themen