【发布时间】:2014-09-22 16:03:18
【问题描述】:
考虑以下:
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 值需要是不可变的。经常访问和修改相同的模型。我们不想冒险有人在事后为其赋值。我想我正在寻找一种保持不变性的最佳实践。
【问题讨论】:
-
如现在所示,绝对没有办法在没有反射的情况下设置这个
_name字段。您需要解释您可以/不能更改的内容,以便建议不同的选项。 -
您必须使该属性具有设置器。如果 BLL 需要修改它,那么模型需要暴露它。
-
@AlexeiLevenkov 请查看关于不变性的编辑。
-
“如何修改不可变值”对我来说没有多大意义。考虑阅读 Eric Lippert 的 Kinds of Immutability,这样您就可以阐明“不可变”在您的案例中的含义。
标签: c# properties model bll