1

考虑以下内容:

public class Project.Model.ModelName : BaseClass
{
    private int _id;
    private string _name;

    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    public string Name
    {
        get { return _name; }
    }
}

public class Project.BLL.ModelName
{
    public static string ComputeName(Model.ModelName m)
    {
        // Determine value using complex business logic

        return "Whatever";
    }

    public static bool SetName(Model.ModelName m)
    {
        string Name = ComputeName(m);

        // How can I set the ModelName.Name value here?
        m.Name = ??? // No set accessor
    }
}

我有一个带有字符串属性的模型,它只有一个 get 访问器,我们不希望直接设置该值。

该属性的值是在 BLL(一个不同的库)中计算的。

在不使用反射的情况下设置属性值的最佳方法是什么?

澄清一下,挑战在于 Name 值需要是不可变的。经常访问和修改相同的模型。我们不想冒险有人在事后为其赋值。我想我正在寻找一种最佳实践来保持不变性。

4

1 回答 1

0

ModelName.Name属性只有在_name. 你不可能改变它的原样。在防止其他人这样做的同时,唯一的方法是通过访问修饰符。

如果Project.BLLProject.Model在同一个程序集中,您可以使用internal修饰符来限制来自其他程序集的访问。或应用[assembly: InternalsVisibleTo("Project.BLL")]一个Project.Model.ModelName

 //1. Add a setter on the property, or : 
public string Name
{
    get { return _name; }
    internal set { _name = value; }
}

//2. Add a setter method for _name :
internal void SetName(string value)
{
    _name = value;
}
于 2014-07-30T21:02:44.003 回答