17

我可能会错误地问这个问题,但是您可以/如何在其自身的类中找到字段...例如...

public class HtmlPart {
  public void Render() {
    //this.GetType().GetCustomAttributes(typeof(OptionalAttribute), false);
  }
}

public class HtmlForm {
  private HtmlPart _FirstPart = new HtmlPart();      
  [Optional] //<-- how do I find that?
  private HtmlPart _SecondPart = new HtmlPart();
}

或者也许我只是做错了......我怎样才能调用一个方法,然后检查应用于自身的属性?

另外,为了这个问题- 我只是好奇是否可以在不知道/访问父类的情况下找到属性信息!

4

3 回答 3

14

如果我正确理解你的问题,我认为你试图做的事情是不可能的......

在该Render方法中,您希望获得应用于对象的可能属性。属性属于领域,_SecondPart女巫属于类HtmlForm

为此,您必须将调用对象传递给Render方法:

    public class HtmlPart {
        public void Render(object obj) {
            FieldInfo[] infos = obj.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);

            foreach (var fi in infos)
            {
                if (fi.GetValue(obj) == this && fi.IsDefined(typeof(OptionalAttribute), true))
                    Console.WriteLine("Optional is Defined");
            }
        }
    }
于 2009-04-29T17:08:58.783 回答
10

这是给定单个对象的示例,如何查找该对象上的任何公共或私有字段是否具有特定属性:

var type = typeof(MyObject);
foreach (var field in type.GetFields(BindingFlags.Public |
             BindingFlags.NonPublic | BindingFlags.Instance))
{
    if (field.IsDefined(typeof(ObsoleteAttribute), true))
    {
        Console.WriteLine(field.Name);
    }

}

对于您问题的第二部分,您可以使用以下方法检查属性是否在当前方法上被定义:

MethodInfo.GetCurrentMethod().IsDefined(typeof(ObsoleteAttribute));

编辑

要回答您的编辑,可以在不知道实际类型的情况下进行。以下函数采用类型参数并返回具有给定属性的所有字段。某个地方的某个人要么知道您要搜索的类型,要么将拥有您要搜索的类型的实例。

没有那个,你必须按照 Jon Skeet 所说的那样枚举程序集中的所有对象。

   public List<FieldInfo> FindFields(Type type, Type attribute)
    {
        var fields = new List<FieldInfo>();
        foreach (var field in type.GetFields(BindingFlags.Public |
                           BindingFlags.NonPublic |
                           BindingFlags.Instance))
        {
            if (field.IsDefined(attribute, true))
            {
                fields.Add(field);
            }

        }
        return fields;
    }
于 2009-04-29T16:46:13.970 回答
4

您可以使用 查找类中的字段,并且可以使用或Type.GetFields查找应用于字段的属性- 但如果您需要查找特定类型的所有字段,则必须:MemberInfo.GetCustomAttributesIsDefined

  • 遍历您要搜索的所有程序集
  • 迭代每个程序集中的所有类型
  • 遍历每种类型中的所有字段
  • 检查每个字段的属性是否存在

现在,如果您真的想找出“是否将特定属性应用于其值是对 'this' 对象的引用的字段”,那就更难了——因为您必须了解系统中的每个对象. 您还应该记住,可能有两个字段都具有相同的值,即引用相同的对象。在这种情况下,该对象是否算作“可选”?

基本上,如果对象应该有一个属性(例如是否可选),那么它必须是对象本身的属性,而不是包含该属性的字段。

可能是我误解了你想要做的事情,但我怀疑这要么不可行,要么至少不是一个好主意。你能在这里解释一下大局吗?你真正想用这个属性实现什么?

于 2009-04-29T16:43:31.793 回答