为什么Attribute.IsDefined不检查Myproperty的自定义属性列表

时间:2017-08-17 04:05:09

标签: c# reflection

下面的代码行应该给我一个属性列表,其中定义了我的属性,但它没有给我任何结果。

var props = typeof(D).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(MYAttribute)));

示例属性

  [Serializable]
  [Table()]
  public class MYClass : IMyInterface
  { 
      [Column()]
      [MyAttribute(HeaderFields.MyValue)]
      public string MyProp { get; set; }
  }

当我调试时,我能够看到该属性包含自定义属性列表中的属性。我在这里缺少什么?

enter image description here

修改

我试图在下面的函数中获取属性

private static void MyFunction<D>(D MyObj)
  where D : IMyInterface                              
{
 var props = typeof(D).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(MYAttribute)));
}

修改

真正的问题是Visual Studio在不同命名空间中定义了相同名称的属性时没有给出任何冲突错误/警告。

1 个答案:

答案 0 :(得分:0)

假设您安排了以下代码:

[Serializable]
[Table("FooTable")]
public class MYClass : IMyInterface
{
    [Column("FooColumn")]
    [My(HeaderFields.MyValue)]
    public string MyProp { get; set; }
}

public class MyAttribute : Attribute
{
    public MyAttribute(object myValue) { }
}

public enum HeaderFields
{
    MyValue,
    MyAnotherValue
}

public interface IMyInterface
{
    string MyProp { get; set; }
}

现在,您可以通过以下方式获取已定义属性MyAttribute的所有属性:

using System;
using System.Linq;
using System.Reflection;

class Program
{
    public static void Main(string[] args)
    {
        var props = typeof(MYClass).GetProperties().Where(prop => prop.IsDefined(typeof(MyAttribute), false));

        foreach (PropertyInfo propertyInfo in props)
        {
            string newLine = Environment.NewLine;

            Console.Out.WriteLine($"propertyInfo:" + newLine +
                                  $"\tName = {propertyInfo.Name}," + newLine +
                                  $"\Format = {propertyInfo}" + newLine);
        }
    }
}

鉴于提供的示例,您应该获得这样的结果:

  

的PropertyInfo:

     

名称= MyProp,

     

Format = System.String MyProp