仅获取实现接口的属性

时间:2011-11-15 21:36:58

标签: c# reflection

我有一个实现接口的类。我只想检查实现我的接口的属性值。

所以,比方说,我有这个界面:

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 个答案:

答案 0 :(得分:8)

如果您提前了解界面,为什么要使用反射?为什么不测试它是否实现了接口然后转换为那个?

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

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

如果你真的必须使用反射,请获取接口类型的属性,所以使用这一行来获取属性:

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

答案 1 :(得分:3)

我倾向于同意看起来你想要转向界面,正如Paul T.所暗示的那样。

但是,您要询问的信息以InterfaceMapping类型提供,可从GetInterfaceMap实例的Type方法获得。从

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

“接口映射表示接口如何映射到实现该接口的类上的实际方法。”

例如:

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

答案 2 :(得分:1)

也许有一个辅助界面:

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
}

答案 3 :(得分:0)

你可以遍历typeof(T).GetInterfaces并在每个上面调用GetProperties()。

参考:http://msdn.microsoft.com/en-us/library/system.type.getinterfaces.aspx