代码之家  ›  专栏  ›  技术社区  ›  Joel Abrahamsson

如何将属性的PropertyInfo作为属性中的参数传递?

  •  0
  • Joel Abrahamsson  · 技术社区  · 17 年前

    假设我有两门课:

    class A
    {
       [SortOrder(3)]
       public string Name { get; set; }
    }
    
    class B : A
    {
       [SortBefore(*****)]
       public string Age { get; set; }
    }
    

    请注意第二个类中property属性中的星号。在SortBefore属性中指定一个.Name(我想使用表达式)是否可能?请注意,我不是在A的实例中查找Name的值,而是在A中查找属性名称的PropertyInfo,以便在B中使用年龄的PropertyInfo时,可以从其超类中检索SortOrder值。

    3 回复  |  直到 17 年前
        1
  •  3
  •   Jon Skeet    17 年前

    恐怕你不能。信息技术 在IL中是可能的——我不确定——但在C中是不可能的。

    最接近你的可能是:

    [排序在(A),“名称”之前]

        2
  •  1
  •   Community Mohan Dere    9 年前

    typeof 运算符由编译器作为 ldtoken 接着是打电话给 Type.GetTypeFromHandle() . 这个 PropertyInfo ldtoken IL指令不能将属性元数据标记作为参数,并且没有RuntimePropertyHandle类型。但是,可以在IL via中获得getter和/或setter方法(这不是有效的IL,但显示了说明)。不幸的是,在C#中没有直接的方法来生成具有 typeof() 操作员提供。

    ldtoken <method>
    call MethodBase.GetMethodFromHandle
    

    答案 this earlier question

    Jon的答案是正确的,你可能不得不使用这个解决方案。

        3
  •  0
  •   Allen Clark Copeland Jr    13 年前

    只是想补充一下Jon Skeet所说的内容:即使在IL中,这也是不可能的。比方说,对于kicks,您可以通过编写自己的编译器,并将属性的元数据标记注入属性,来获取属性的MetadataToken。在运行时,您将无法要求属性来自的模块解析元数据令牌;您将收到以下消息:

    此API不支持PropertyInfo令牌。

    测试这一点的一种方法是获取 PropertyInfo ResolveMember int 元数据标记的值,并将 PropertyInfo.MetadataToken :

    Console.WriteLine(propInfo.DeclaringType.Module.ResolveMember(propInfo.MetadataToken));
    

    如果你能把房子的 MetadataToken MetadataToken 并让它检索 物业资讯 MetadataToken 会是你的目标。

    理解这一点至关重要 MetadataToken

    推荐文章