Запретить установку свойств в. NET - PullRequest
1 голос
/ 11 марта 2020

Я хотел бы реализовать некоторые ограничения доступа при создании модели. В настоящее время мой код выглядит более как это.

public Model GetModel()
{
    Model model = new Model();
    if (isAllowedToSet(Field.A))
        model.FieldA = 1;
    if (isAllowedToSet(Field.B))
        model.FieldB = 2;
    if (isAllowedToSet(Field.C))
        model.FieldC = 3;
    return model;
}
private bool isAllowedToSet(Field field)
{
    return (field == Field.A); //Here comes some real logic
}
class Model
{
    public int FieldA { get; set; }
    public int FieldB { get; set; }
    public int FieldC { get; set; }
}

Как сделать это умнее? Я думал об использовании FieldAttribute, но я не нашел решения, хотя. Или есть другой способ?

1 Ответ

0 голосов
/ 11 марта 2020

Ну, да, вы могли бы сделать это с отражением и атрибутами

public class Model
{
    [ReadOnly(true)]
    public int FieldA { get; set; }
    public int FieldB { get; set; }
    public int FieldC { get; set; }
}

public Model GetModel()
{
    Model model = new Model();

    if (isAllowedToSet(() => model.FieldA))
        model.FieldA = 1;

    if (isAllowedToSet(() => model.FieldB))
        model.FieldB = 2;

    if (isAllowedToSet(() => model.FieldC))
        model.FieldC = 3;

    return model;
}

private bool isAllowedToSet<T>(Expression<Func<T>> propertyExpression)
{
    var propertyName = ((MemberExpression)propertyExpression.Body).Member.Name;            
    Attribute readonlyAtt = TypeDescriptor.GetProperties(this)[propertyName].Attributes[typeof(ReadOnlyAttribute)];

    return readonlyAtt == null || readonlyAtt.Equals(ReadOnlyAttribute.No);
}

Независимо от того, хотите ли вы или нет, это совсем другое дело, поскольку это выглядит как это исправление для проблемы, которая, вероятно, имеет более элегантное решение, не включающее рефлексию (которая медленна, помимо всего прочего).

Если вы можете подробнее рассказать, почему вы пытаетесь это сделать, вы можете получить лучший ответ.

...