【问题标题】:Prevent from setting properties in .NET防止在 .NET 中设置属性
【发布时间】:2020-06-23 08:04:56
【问题描述】:

我想在创建模型时实施一些访问限制。目前我的代码看起来更像这样。

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,但我还没有找到解决方案。还是有别的办法?

【问题讨论】:

  • 如果我们了解基础知识.. private set; 工作..?
  • 我认为您应该查看 Microsoft 文档中的以下文章:@irf 在他/她的评论中建议的stackoverflow.com/a/55470551/8293694docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • 您能否提供有关您要解决的问题的更多信息?这看起来很笨拙。您的 GetModel() 看起来像一个工厂方法,您能否为仅填充属性子集的不同消费者提供不同的工厂?
  • @GazTheDestroyer 确定 - 这不是实际代码,只是想让事情变得简单。 GetModel 是一个服务方法,在 ApiController 中调用。它使用允许当前用户查看的值来丰富模型。这些是在数据库中检查的,因此覆盖 setter 并不是一个很好的解决方案,因为我必须混合所有应用程序层。

标签: c# .net custom-attributes


【解决方案1】:

嗯,是的,你可以使用反射和属性来做到这一点

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);
}

您是否应该完全是另一回事,因为这似乎是一个解决问题的方法,该问题可能有一个不涉及反射的更优雅的解决方案(除了其他任何事情之外,它都很慢)。

如果您能详细说明您尝试这样做的原因,您可能会得到更好的回应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 2014-11-14
    • 2011-12-16
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多