类似:How I can find Data Annotation attributes and their parameters using reflection
但是,在尝试收集自定义属性时,我总是得到相同的结果。空ScriptIgnore
。
PropertyInfo[] Properties = Entity.GetType().GetProperties();
foreach (PropertyInfo Property in Properties)
经过调试,这行代码
var annotes = Property.GetCustomAttributes(typeof(ScriptIgnoreAttribute), false);
(我也尝试使用true
)
看起来像这样
annotes | {System.Web.Script.Serialization.ScriptIgnoreAttribute[0]}
但是,Property被定义为类似
的类属性public virtual Lot Lot { get; set; }
没有附加[ScriptIgnore]
属性。此外,当我在Property上尝试这个时,就像这样定义了
[ScriptIgnore]
public virtual ICollection<Lot> Lots { get; set; }
我得到与上面相同的结果
annotes | {System.Web.Script.Serialization.ScriptIgnoreAttribute[0]}
如何使用反射来确定属性是否存在?或者其他方法,如果可能的话,我也试过
var attri = Property.Attributes;
但它不包含任何属性。
答案 0 :(得分:4)
以下代码有效:
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; }
}
定义静态扩展名:
public static class AttributeExtension
{
public static bool HasAttribute(this PropertyInfo target, Type attribType)
{
var attribs = target.GetCustomAttributes(attribType, false);
return attribs.Length > 0;
}
}
将以下示例代码放入方法中,它会正确地获取属性 - 顺便提一下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();
注意:如果您正在使用EF动态代理类,我认为您需要使用ObjectContext.GetObjectType()
来解析原始类,然后才能获取属性,因为EF生成的代理类将不继承属性。
答案 1 :(得分:1)
var props = type.GetProperties()
.Where(p => p.GetCustomAttributes().Any(a => a is ScriptIgnoreAttribute))
.ToList();