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