如何使用反射来确定属性上是否存在属性?

Tra*_*s J 2 c# reflection

类似:如何使用反射查找数据注释属性及其参数

但是,当尝试收集自定义属性时,我总是得到相同的结果。一个空的ScriptIgnore

PropertyInfo[] Properties = Entity.GetType().GetProperties();
foreach (PropertyInfo Property in Properties)
Run Code Online (Sandbox Code Playgroud)

调试后,这行代码

var annotes = Property.GetCustomAttributes(typeof(ScriptIgnoreAttribute), false);
Run Code Online (Sandbox Code Playgroud)

(我也尝试过使用true

看起来像这样

annotes | {System.Web.Script.Serialization.ScriptIgnoreAttribute[0]}
Run Code Online (Sandbox Code Playgroud)

但是,Property 被定义为类属性,如下所示

public virtual Lot Lot { get; set; }
Run Code Online (Sandbox Code Playgroud)

没有[ScriptIgnore]附加属性。此外,当我在属性上尝试这个时,它是这样定义的

[ScriptIgnore]
public virtual ICollection<Lot> Lots { get; set; }
Run Code Online (Sandbox Code Playgroud)

我得到与上面相同的结果

annotes | {System.Web.Script.Serialization.ScriptIgnoreAttribute[0]}
Run Code Online (Sandbox Code Playgroud)

如何使用反射来确定属性是否存在?或者如果可能的话其他方式,我也尝试过

var attri = Property.Attributes;
Run Code Online (Sandbox Code Playgroud)

但它不包含任何属性。

cod*_*ife 5

以下代码有效:

using System.Web.Script.Serialization;
public class TestAttribute
{
  [ScriptIgnore]
  public string SomeProperty1 { get; set; }

  public string SomeProperty2 { get; set; }

  public string SomeProperty3 { get; set; }

  [ScriptIgnore]
  public string SomeProperty4 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

定义静态扩展:

public static class AttributeExtension
{
  public static bool HasAttribute(this PropertyInfo target, Type attribType)
  {
    var attribs = target.GetCustomAttributes(attribType, false);
    return attribs.Length > 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

将以下示例代码放入方法中,它会正确获取属性 - 包括ICollection顺便说一下:

  var test = new TestAttribute();
  var props = (typeof (TestAttribute)).GetProperties();
  foreach (var p in props)
  {
    if (p.HasAttribute(typeof(ScriptIgnoreAttribute)))
    {
      Console.WriteLine("{0} : {1}", p.Name, attribs[0].ToString());
    }
  }

  Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用 EF 动态代理类,我认为您需要先使用ObjectContext.GetObjectType()解析为原始类,然后才能获取属性,因为 EF 生成的代理类不会继承这些属性。