只获取实现接口的属性



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

比如说,我有这样一个接口:

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') 

而不是检查,看看我的属性名称是==到一个神奇的字符串,我想简单地检查,看看属性是否从我的接口实现。

如果您提前知道接口,为什么要使用反射?为什么不测试它是否实现了接口,然后将其转换为该接口呢?

var myClassInstance = new MyClass();
var interfaceImplementation = myClassInstance as IFooBar
if(interfaceImplementation != null)
{
    //implements interface
    interfaceImplementation.foo ...
}

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

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

我倾向于同意,就像Paul T.建议的那样,看起来您想要强制转换到接口。

然而,您所询问的信息在InterfaceMapping类型中是可用的,可以从Type实例的GetInterfaceMap方法中获得。从

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

"接口映射表示如何将接口映射到实现该接口的类的实际方法中。"

例如:

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

可能有一个辅助接口:

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
}

可以遍历typeof(T)。GetInterfaces和调用GetProperties()。

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

相关内容

  • 没有找到相关文章

最新更新