C#Generic添加自定义属性属性

时间:2018-05-02 08:23:58

标签: c# asp.net-mvc data-annotations custom-attributes

我有这个型号:

public class StepAttribute : Attribute
{
    private string stepName;

    public string StepName
    {
        get { return stepName; }
        set { stepName = value; }
    }
}

我创建StepAttribute以用作属性Attribute

public static IEnumerable<PropertyInfo> GetPropertiesFrom<T>(this object instance,string propertyName) where T : Attribute
{
    var attrType = typeof(T);
    var properties = instance.GetType()
        .GetProperties()
        .Where (x =>
        );

    //return (T)property.GetCustomAttributes(attrType, false).First();
    //typeof(DisplayAttribute), true) //select many because can have multiple attributes
    //        .Select(e => ((DisplayAttribute)e))) //change type from generic attribute to DisplayAttribute
    //    .Where(x => x != null).Select(x => x.Name)
    return properties;
}

我有通用类来获取IEnumerable属性传递&#34;&#34;类属性,实例是对象模型和属性名称。

{{1}}

问题:如何从模型中返回IEnumerable PropertyInfo,其中StepAtttribute.StepName等于propertyName?

1 个答案:

答案 0 :(得分:1)

它并不是100%清楚你在问什么,但是从你的问题来看,你似乎想要一个方法,它将采用任何类型的字符串和字符串来表示&#34; name&#34;并使用它们获取给定类的属性列表,其中名称设置为给定名称。以下是否对您有帮助?:

private static IEnumerable<PropertyInfo> GetPropertiesByStepName<TModel>(TModel model, string name)
{
    // Get the properties where there is a StepAttribute and the name is set to the `name` parameter
    var properties = model.GetType()
        .GetProperties()
        .Where(x =>
            x.GetCustomAttribute<StepAttribute>() != null &&
            x.GetCustomAttribute<StepAttribute>().Name == name);

    return properties;
}

注意:您需要使用命名空间System.Reflection