Оцените пользовательский атрибут модели более общим способом - PullRequest
3 голосов
/ 25 октября 2019

У меня есть модель данных, как показано ниже. Одно из его свойств было украшено пользовательским атрибутом - «Mergable»:

public class Example
{
    [Browsable(false)]
    [Mergable(false)]
    public int ExampleId { get; set; }
}

Вот определение «Mergable»:

[AttributeUsage(AttributeTargets.Property)]
public class MergableAttribute : Attribute
{
    public MergableAttribute()
    {
        Mergable = false;
    }

    public MergableAttribute(bool value)
    {
        Mergable = value;
    }

    public bool Mergable { get; set; } = false;
}

Я использую класс AttributeEvaluator для оценки атрибута:

public class AttributeEvaluator
{
    public bool Evaluate(object instance, string propertyName)
    {
        AttributeCollection attributes = TypeDescriptor.GetProperties(instance)[propertyName].Attributes;
        foreach (var a in attributes)
        {
            if (a.GetType() == typeof(MergableAttribute))
            {
                return ((MergableAttribute)a).Mergable;
            }
        }
        return false;
    }
}

Я могу получить значение атрибута из форм, как показано ниже:

private void btnAdd_Click(object sender, EventArgs e)
    {

        bool x = new AttributeEvaluator().Evaluate(new Example(), "ExampleId");
    }

Мне интересно, как я могу сделать его более общим. Идеальная ситуация - иметь один класс для оценки всех пользовательских атрибутов. Я могу передать тип атрибута в метод Evaluate, но не могу привести его к соответствующему типу, чтобы получить значение «Mergable».

public class AttributeEvaluator
{
    public bool Evaluate(object instance, string propertyName, Type attributeType)
    {
        AttributeCollection attributes = TypeDescriptor.GetProperties(instance)[propertyName].Attributes;
        foreach (var a in attributes)
        {
            if (a.GetType() == attributeType)
            {
                return ((MergableAttribute)a).Mergable; //<-- how to cast a to appopriate type?
            }
        }
        return false;
    }
}

Есть ли способ, которым я могу этого достичь, или это просто погоня за диким гусем?

...