Получить только свойства, которые реализуют интерфейс - PullRequest
6 голосов
/ 16 ноября 2011

У меня есть класс, который реализует интерфейс.Я хотел бы изучить только значения свойств, которые реализуют мой интерфейс.

Итак, скажем, например, у меня есть этот интерфейс:

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

И этот класс:

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

Итак, мне нужно выполнить это, без магиистроки:

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. 

}

Как я могу заменить это:

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

Вместо того, чтобы проверять, является ли мое свойство == магической строкой, я хотел бы простопроверьте, реализовано ли свойство из моего интерфейса.

Ответы [ 4 ]

8 голосов
/ 16 ноября 2011

Зачем использовать отражение, если вы знаете интерфейс заранее? Почему бы просто не проверить, реализует ли он интерфейс, а затем привести его к этому?

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

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

Если вам действительно нужно использовать отражение, получите свойства типа интерфейса, поэтому используйте эту строку для получения свойств:

foreach (var pi in typeof(IFooBar).GetProperties()) {
3 голосов
/ 16 ноября 2011

Я склонен согласиться, что похоже, что вы хотите привести к интерфейсу, как полагает Пол Т..

Однако информация, которую вы запрашиваете, доступна в виде InterfaceMapping, доступном из метода GetInterfaceMap экземпляра Type. От

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

"Карта интерфейса обозначает, как интерфейс отображается в фактические методы класса, реализующего этот интерфейс."

например:

var map = typeof(int).GetInterfaceMap(typeof(IComparable<int>));
1 голос
/ 16 ноября 2011

Возможно иметь дополнительный интерфейс:

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

Добавить второй интерфейс:

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

И проверить это так:

var myClassInstance = new MyClass();

if(myClassInstance is IFooAlso) {
   // Use it
}
0 голосов
/ 16 ноября 2011

Вы можете перебирать typeof (T) .GetInterfaces и вызывать GetProperties () для каждого из них.

Ссылка: http://msdn.microsoft.com/en-us/library/system.type.getinterfaces.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...