下面的代码行应该给我一个属性列表,其中定义了我的属性,但它没有给我任何结果。
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; }
}
当我调试时,我能够看到该属性包含自定义属性列表中的属性。我在这里缺少什么?
修改
我试图在下面的函数中获取属性
private static void MyFunction<D>(D MyObj)
where D : IMyInterface
{
var props = typeof(D).GetProperties().Where(prop => Attribute.IsDefined(prop, typeof(MYAttribute)));
}
修改
真正的问题是Visual Studio在不同命名空间中定义了相同名称的属性时没有给出任何冲突错误/警告。
答案 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