我有一个像这样的课吧:
class Foo : IFoo {
[Range(0,255)]
public int? FooProp {get; set}
}
class Bar : IFoo
{
private Foo foo = new Foo();
public int? FooProp { get { return foo.FooProp; }
set { foo.FooProp= value; } }
}
我需要在属性Bar.FooProp上找到仅反映属性[Range(0,255)]。我的意思是,当我正在解析时,prop在类实例(.. new Foo())中被装饰,而不是在类中。事实上,Bar.FooProp没有属性
修改
我在接口的定义上移动了属性,所以我要做的就是解析继承的接口以找到它们。我可以这样做,因为Bar类必须实现IFoo。在这种特殊情况下,我很幸运,但是当我没有接口时问题仍然存在......我将在下次注意
foreach(PropertyInfo property in properties)
{
IList<Type> interfaces = property.ReflectedType.GetInterfaces();
IList<CustomAttributeData> attrList;
foreach(Type anInterface in interfaces)
{
IList<PropertyInfo> props = anInterface.GetProperties();
foreach(PropertyInfo prop in props)
{
if(prop.Name.Equals(property.Name))
{
attrList = CustomAttributeData.GetCustomAttributes(prop);
attributes = new StringBuilder();
foreach(CustomAttributeData attrData in attrList)
{
attributes.AppendFormat(ATTR_FORMAT,
GetCustomAttributeFromType(prop));
}
}
}
}
答案 0 :(得分:2)
我有一个类似的情况,我在接口上的方法上声明了一个属性,我希望从实现接口的类型的方法获取属性。例如:
interface I {
[MyAttribute]
void Method( );
}
class C : I {
void Method( ) { }
}
下面的代码用于检查该类型实现的所有接口,查看给定method
实现的接口成员(使用GetInterfaceMap
),并返回这些成员的所有属性。在此之前,我还检查方法本身是否存在该属性。
IEnumerable<MyAttribute> interfaceAttributes =
from i in method.DeclaringType.GetInterfaces( )
let map = method.DeclaringType.GetInterfaceMap( i )
let index = GetMethodIndex( map.TargetMethods, method )
where index >= 0
let interfaceMethod = map.InterfaceMethods[index]
from attribute in interfaceMethod.GetCustomAttributes<MyAttribute>( true )
select attribute;
...
static int GetMethodIndex( MethodInfo[] targetMethods, MethodInfo method ) {
return targetMethods.IndexOf( target =>
target.Name == method.Name
&& target.DeclaringType == method.DeclaringType
&& target.ReturnType == method.ReturnType
&& target.GetParameters( ).SequenceEqual( method.GetParameters( ), PIC )
);
}
答案 1 :(得分:1)
在查看FooProp
时,没有任何内容可以确定Foo
的存在(在任何时候)。也许您可以添加一个属性来标识foo
字段,然后反思(通过FieldInfo.FieldType
)?