У меня есть модель данных, как показано ниже. Одно из его свойств было украшено пользовательским атрибутом - «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;
}
}
Есть ли способ, которым я могу этого достичь, или это просто погоня за диким гусем?