我有一个实现接口的类。我只想检查实现我的接口的属性值。
比如说,我有这样一个接口:
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