C# 循环到类元数据中的自定义属性(以避免修改自动生成的逐实体类框架图)
我使用实体框架图创建了我的项目,它创建了数据库和模型类。 由于我不能从自动生成的文件中修改该类(我可以,但如果我修改图表,所有更改都会丢失),并且我想使用数据注释,所以我创建了一个元数据类。在元数据类中,我可以添加数据注释,但问题是,如果我添加自定义属性,当我循环到属性的自定义属性中时,它不会显示出来,如果我在自动生成的文件中的类中添加自定义属性,它会起作用。我只想在列表中添加所有具有[Filtrable]自定义属性的类属性 自动生成的类:C# 循环到类元数据中的自定义属性(以避免修改自动生成的逐实体类框架图),c#,asp.net-mvc,entity-framework,metadata,custom-attributes,C#,Asp.net Mvc,Entity Framework,Metadata,Custom Attributes,我使用实体框架图创建了我的项目,它创建了数据库和模型类。 由于我不能从自动生成的文件中修改该类(我可以,但如果我修改图表,所有更改都会丢失),并且我想使用数据注释,所以我创建了一个元数据类。在元数据类中,我可以添加数据注释,但问题是,如果我添加自定义属性,当我循环到属性的自定义属性中时,它不会显示出来,如果我在自动生成的文件中的类中添加自定义属性,它会起作用。我只想在列表中添加所有具有[Filtrable]自定义属性的类属性 自动生成的类: public partial class Person
public partial class Persona
{
public Persona()
{
this.ActividadRegistro = new HashSet<ActividadRegistro>();
}
public int Id { get; set; }
public string Nombre { get; set; }
public string Direccion { get; set; }
public string Telefono { get; set; }
public Sexo Sexo { get; set; }
public System.DateTime Registro { get; set; }
public virtual ICollection<ActividadRegistro> ActividadRegistro { get; set; }
}
自定义属性:
[AttributeUsage(AttributeTargets.All)]
public class Filtrable : Attribute, IMetadataAware
{
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.DisplayName = metadata.GetDisplayName() + " (Propiedad que puede ser filtrado)";
metadata.AdditionalValues["Filtrable"] = true;
}
}
循环不工作
PropertyInfo[] properties = typeof(Persona).GetProperties();
ArrayList propertiesThatCanBeFiltered = new ArrayList();
foreach (var property in properties)
{
Object[] attributes = property.GetCustomAttributes(typeof(true));
foreach (var attribute in attributes)
{
if (attribute is Filtrable)
{
//It never reachs here ! but if I add the [Filtrable] tag at a property in the
//auto-generated class it will work.
propertiesThatCanBeFiltered.Add(property.Name);
}
}
}
解决方案:
Persona persona = new Persona();
ArrayList propertiesThatCanBeFiltered = new ArrayList();
var metaDatas = ModelMetadataProviders.Current.GetMetadataForProperties(persona, persona.GetType());
foreach (var metaData in metaDatas)
{
if (metaData.AdditionalValues.ContainsKey("Filtrable"))
propertiesThatCanBeFiltered.Add(metaData.PropertyName);
}
好的,我使用GetMetadataForProperties解决了这个问题:
Persona persona = new Persona();
ArrayList propertiesThatCanBeFiltered = new ArrayList();
var metaDatas = ModelMetadataProviders.Current.GetMetadataForProperties(persona, persona.GetType());
foreach (var metaData in metaDatas)
{
if (metaData.AdditionalValues.ContainsKey("Filtrable"))
propertiesThatCanBeFiltered.Add(metaData.PropertyName);
}
我希望这能帮助别人
Persona persona = new Persona();
ArrayList propertiesThatCanBeFiltered = new ArrayList();
var metaDatas = ModelMetadataProviders.Current.GetMetadataForProperties(persona, persona.GetType());
foreach (var metaData in metaDatas)
{
if (metaData.AdditionalValues.ContainsKey("Filtrable"))
propertiesThatCanBeFiltered.Add(metaData.PropertyName);
}