考虑以下内容:
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值必须是不可变的。经常访问和修改相同的模型。事实上,我们不想冒险为某人分配价值。我想我正在寻找保持不变性的最佳做法。
答案 0 :(得分:0)
ModelName.Name
属性只在_name
上指定了一个getter。你无法改变现状。防止对方做同样的事情的唯一方法是通过访问修饰符。
如果Project.BLL
和Project.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;
}