但是,当尝试收集自定义属性时,我总是得到相同的结果。一个空的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)
但它不包含任何属性。
以下代码有效:
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 生成的代理类不会继承这些属性。
| 归档时间: |
|
| 查看次数: |
3741 次 |
| 最近记录: |