我有一个实现接口的类。我只想检查实现我的接口的属性值。
所以,比方说,我有这个界面:
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')
我不想检查我的属性名称是==
到魔术字符串,而是想查看该属性是否是从我的界面实现的。
答案 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