gpt4 book ai didi

c# - 反射(reflect)属性以获取属性。当它们在别处定义时怎么办?

转载 作者:行者123 更新时间:2023-11-30 12:18:57 26 4
gpt4 key购买 nike

我有一个类 Bar 是这样的:

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; } }
}

我需要找到仅反射(reflect)属性 Bar.FooProp 的属性 [Range(0,255)]。我的意思是,当我当前正在解析时, Prop 是在类实例 (.. new Foo()) 中装饰的,而不是在类中。事实上 Bar.FooProp 没有属性

编辑

我在接口(interface)的定义上移动了属性,所以我必须做的是解析继承的接口(interface)以找到它们。我可以这样做,因为 Bar 类必须实现 IFoo。在这种特殊情况下,我很幸运,但是当我没有接口(interface)时问题仍然存在......我下次会注意

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));
}
}
}
}

最佳答案

前一段时间我遇到过类似的情况,我在接口(interface)的方法上声明了一个属性,我想从实现该接口(interface)的类型的方法中获取该属性。例如:

interface I {
[MyAttribute]
void Method( );
}

class C : I {
void Method( ) { }
}

下面的代码用于检查类型实现的所有接口(interface),查看给定的方法实现了哪些接口(interface)成员(使用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 )
);
}

关于c# - 反射(reflect)属性以获取属性。当它们在别处定义时怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1021447/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com