C # Generic добавить свойства пользовательских атрибутов - PullRequest
0 голосов
/ 02 мая 2018

У меня есть эта модель:

public class MobileKeyViewData
{
    [Step(StepName="PersonalData")]
    public int PhoneNumber { get; set; }

    [Step(StepName="PersonalData")]
    public string Email { get; set; }

     [Step(StepName="Confirmation")]
    public int Code{ get; set; }
}

Я создаю StepAttribute для использования в качестве атрибута свойства

public class StepAttribute : Attribute
{
    private string stepName;

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

У меня есть универсальный класс для получения свойств IEnumerable, передающих «» атрибут класса, экземпляр - это объектная модель и имя свойства.

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 PropertyInfo из модели, где StepAtttribute.StepName равно propertyName?

1 Ответ

0 голосов
/ 02 мая 2018

Это не на 100% ясно, что вы спрашиваете, но из вашего вопроса выясняется, что вам нужен метод, который будет принимать класс любого типа и строку для «name» и использовать их для получения списка свойств в данный класс, где имя установлено на данное имя. Вам помогает следующее:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...