2011-11-15 12 views
5

Tengo una clase que implementa una interfaz. Me gustaría examinar solo los valores de las propiedades que implementan mi interfaz.Obtener solo las propiedades que implementan una interfaz

tanto, vamos a decir, por ejemplo, tengo esta interfaz:

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

Y esta clase:

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

Por lo tanto, tengo que lograr esto, sin las cuerdas mágicas:

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. 

} 

¿Cómo puedo reemplazar esto:

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

En lugar de verificar si el nombre de mi propiedad es == en una cadena mágica, me gustaría simplemente verificar si la propiedad se implementó desde mi interfaz.

Respuesta

8

¿Por qué usar la reflexión si conoce la interfaz con tiempo? ¿Por qué no simplemente prueba si implementa la interfaz y luego lo lanza a eso?

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

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

Si realmente tiene que utilizar la reflexión, obtener las propiedades del tipo de interfaz, a fin de utilizar esta línea para conseguir propiedades:

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

estoy usando la interfaz de comparar los valores de dos objetos que implementan la interfaz, pero puede no ser del mismo tipo. Básicamente una verificación de igualdad entre dos tipos diferentes. La función con este código no solo devuelve el igual/no igual, sino las diferencias. Esa es la razón de la reflexión. –

+0

¿Mi segunda sugerencia ayuda, simplemente iterar las propiedades en el tipo de interfaz? –

+0

Sí, eso es lo que necesitaba. Aceptaré tu respuesta tan pronto como expire el tiempo de aceptación. Gracias Paul. –

1

Tal vez tienen una interfaz secundaria:

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

Añadir la segunda interfaz:

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; } 
} 

y probarlo así:

var myClassInstance = new MyClass(); 

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

Tiendo a aceptar que parece que quieres enviar contenido a la interfaz, como sugiere Paul T.

La información que está preguntando, sin embargo, está disponible en el tipo InterfaceMapping, disponible en el método GetInterfaceMap de la instancia Type. De

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

"El mapa de interfaz indica cómo una interfaz está asignada en los métodos reales de una clase que implementa la interfaz."

por ejemplo:

var map = typeof(int).GetInterfaceMap(typeof(IComparable<int>)); 
Cuestiones relacionadas