2011-11-15 13 views
5

Mam klasę, która implementuje interfejs. Chciałbym zbadać tylko wartości właściwości, które implementują mój interfejs.Pobierz tylko właściwości implementujące interfejs

Więc powiedzmy na przykład mam ten interfejs:

public interface IFooBar { 
    string foo { get; set; } 
    string bar { get; set; } 
} 

a ta klasa:

public class MyClass :IFooBar { 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public int MyOtherPropery1 { get; set; } 
    public string MyOtherProperty2 { get; set; } 
} 

Tak, muszę to osiągnąć, bez magicznych ciągów:

var myClassInstance = new MyClass(); 
foreach (var pi in myClassInstance.GetType().GetProperties()) { 
    if(pi.Name == "MyOtherPropery1" || pi.Name == "MyOtherPropery2") { 
     continue; //Not interested in these property values 
    } 
    //We do work here with the values we want. 

} 

Jak mogę to zmienić:

if(pi.Name == 'MyOtherPropery1' || pi.Name == 'MyOtherPropery2') 

Zamiast sprawdzać, czy moja nazwa własności to == do magicznego ciągu, chciałbym po prostu sprawdzić, czy właściwość jest zaimplementowana z mojego interfejsu.

Odpowiedz

8

Po co używać refleksji, jeśli znasz interfejs z wyprzedzeniem? Dlaczego po prostu nie przetestować, czy implementuje interfejs, a następnie rzucić na to?

var myClassInstance = new MyClass(); 
var interfaceImplementation = myClassInstance as IFooBar 

if(interfaceImplementation != null) 
{ 
    //implements interface 
    interfaceImplementation.foo ... 
} 

Jeśli naprawdę musi użyć refleksji, uzyskać właściwości na typ interfejsu, więc korzystać z tej linii, aby uzyskać właściwości:

foreach (var pi in typeof(IFooBar).GetProperties()) { 
+0

Używam interfejsu porównać wartości dwóch obiektów, które implementują ten interfejs, ale nie może być tego samego typu. Zasadniczo kontrola równości między dwoma różnymi typami. Funkcja z tym kodem zwraca nie tylko równe/nie równe, ale różnice. To jest powód refleksji. –

+0

Czy moja druga sugestia pomaga, aby po prostu powtórzyć właściwości na typie interfejsu? –

+0

Tak, tego właśnie potrzebowałem. Przyjmuję odpowiedź, gdy tylko upłynie czas akceptacji. Dziękuję Paul. –

1

Może mieć drugorzędną interfejs:

public interface IFooAlso { 
    int MyOtherProperty1 { get; set; } 
    string MyOtherProperty2 { get; set; } 
} 

dodać drugi interfejs:

public class MyClass :IFooBar, IFooAlso { 
    public string foo { get; set; } 
    public string bar { get; set; } 
    public int MyOtherPropery1 { get; set; } 
    public string MyOtherProperty2 { get; set; } 
} 

i przetestować go tak:

var myClassInstance = new MyClass(); 

if(myClassInstance is IFooAlso) { 
    // Use it 
} 
3

Zgadzam się, że wygląda na to, że chcesz rzucić na interfejs, jak sugeruje Paul T.

Informacje, o które pytasz, są jednak dostępne w typie InterfaceMapping, dostępnym z metody GetInterfaceMap instancji Type. Od

http://msdn.microsoft.com/en-us/library/4fdhse6f(v=VS.100).aspx

„Interfejs mapa wskazuje, jak interfejs jest odwzorowany w rzeczywistych metod na klasy, która implementuje ten interfejs.”

na przykład:

var map = typeof(int).GetInterfaceMap(typeof(IComparable<int>)); 
Powiązane problemy