4

我有一个这样的类酒吧:

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)]。我的意思是,当我当前正在解析时,道具是在类实例(.. 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));
        }
      }
    }
  }
4

2 回答 2

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 )
  );
}
于 2009-10-19T19:55:53.807 回答
1

在查看 时FooProp,没有任何东西可以识别 a 的存在Foo(在任何时候)。也许您可以添加一个属性来识别该foo字段,并对其进行反思(通过FieldInfo.FieldType)?

于 2009-06-20T11:37:51.297 回答