问题描述
如果我通过 MetadataType 属性,通过 Attribute.IsDefined(). 有谁知道为什么,或者我做错了什么?
If I apply attributes to a partial class via the MetadataType attribute, those attributes are not found via Attribute.IsDefined(). Anyone know why, or what I'm doing wrong?
下面是我为此创建的一个测试项目,但我真的想将自定义属性应用于 LINQ to SQL 实体类 - 比如 这个问题的答案.
Below is a test project I created for this, but I'm really trying to apply custom attributes to a LINQ to SQL entity class - like this answer in this question.
谢谢!
using System; using System.ComponentModel.DataAnnotations; using System.Reflection; namespace MetaDataTest { class Program { static void Main(string[] args) { PropertyInfo[] properties = typeof(MyTestClass).GetProperties(); foreach (PropertyInfo propertyInfo in properties) { Console.WriteLine(Attribute.IsDefined(propertyInfo, typeof(MyAttribute))); Console.WriteLine(propertyInfo.IsDefined(typeof(MyAttribute), true)); Console.WriteLine(propertyInfo.GetCustomAttributes(true).Length); // Displays: // False // False // 0 } Console.ReadLine(); } } [MetadataType(typeof(MyMeta))] public partial class MyTestClass { public string MyField { get; set; } } public class MyMeta { [MyAttribute()] public string MyField { get; set; } } [AttributeUsage(AttributeTargets.All)] public class MyAttribute : System.Attribute { } }
推荐答案
MetadataType 属性用于指定帮助指定数据对象的附加信息.要访问其他属性,您需要执行以下操作:
The MetadataType attribute is used to specify help specify the additional information on the data object. To access the additional attributes you would need to do something like the following:
using System; using System.Linq; using System.ComponentModel.DataAnnotations; using System.Reflection; namespace MetaDataTest { class Program { static void Main(string[] args) { MetadataTypeAttribute[] metadataTypes = typeof(MyTestClass).GetCustomAttributes(typeof(MetadataTypeAttribute), true).OfType<MetadataTypeAttribute>().ToArray(); MetadataTypeAttribute metadata = metadataTypes.FirstOrDefault(); if (metadata != null) { PropertyInfo[] properties = metadata.MetadataClassType.GetProperties(); foreach (PropertyInfo propertyInfo in properties) { Console.WriteLine(Attribute.IsDefined(propertyInfo, typeof(MyAttribute))); Console.WriteLine(propertyInfo.IsDefined(typeof(MyAttribute), true)); Console.WriteLine(propertyInfo.GetCustomAttributes(true).Length); RequiredAttribute attrib = (RequiredAttribute)propertyInfo.GetCustomAttributes(typeof(RequiredAttribute), true)[0]; Console.WriteLine(attrib.ErrorMessage); } // Results: // True // True // 2 // MyField is Required } Console.ReadLine(); } } [MetadataType(typeof(MyMeta))] public partial class MyTestClass { public string MyField { get; set; } } public class MyMeta { [MyAttribute()] [Required(ErrorMessage="MyField is Required")] public string MyField { get; set; } } [AttributeUsage(AttributeTargets.All)] public class MyAttribute : System.Attribute { } }
这还包括一个示例属性,用于展示如何提取添加的信息.
This also includes a sample attribute to show how to extract info that was added.