Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环到类元数据中的自定义属性(以避免修改自动生成的逐实体类框架图)_C#_Asp.net Mvc_Entity Framework_Metadata_Custom Attributes - Fatal编程技术网

C# 循环到类元数据中的自定义属性(以避免修改自动生成的逐实体类框架图)

C# 循环到类元数据中的自定义属性(以避免修改自动生成的逐实体类框架图),c#,asp.net-mvc,entity-framework,metadata,custom-attributes,C#,Asp.net Mvc,Entity Framework,Metadata,Custom Attributes,我使用实体框架图创建了我的项目,它创建了数据库和模型类。 由于我不能从自动生成的文件中修改该类(我可以,但如果我修改图表,所有更改都会丢失),并且我想使用数据注释,所以我创建了一个元数据类。在元数据类中,我可以添加数据注释,但问题是,如果我添加自定义属性,当我循环到属性的自定义属性中时,它不会显示出来,如果我在自动生成的文件中的类中添加自定义属性,它会起作用。我只想在列表中添加所有具有[Filtrable]自定义属性的类属性 自动生成的类: public partial class Person

我使用实体框架图创建了我的项目,它创建了数据库和模型类。 由于我不能从自动生成的文件中修改该类(我可以,但如果我修改图表,所有更改都会丢失),并且我想使用数据注释,所以我创建了一个元数据类。在元数据类中,我可以添加数据注释,但问题是,如果我添加自定义属性,当我循环到属性的自定义属性中时,它不会显示出来,如果我在自动生成的文件中的类中添加自定义属性,它会起作用。我只想在列表中添加所有具有[Filtrable]自定义属性的类属性

自动生成的类:

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);
        }