你在代码中删除(帮助/扩展方法)字符串文字做了什么?
e.g。我有各种各样的nhibernate搜索条件代码。
Expression.Eq("Status", LoginStatus.LoggedIn),
“状态”是在案例中用作字符串的实体对象的属性。
更新:在这种情况下,主要原因是启用重构。如果我编写一个反映对象并获取值的辅助方法,将使上面的表达式强类型化。
答案 0 :(得分:2)
这就是“资源”和“设置”的用途。您可以通过在Visual Studio中右键单击项目并单击“属性”,然后转到“资源”或“设置”选项卡来找到它。
对于不会经常更改的预构建资源,请使用资源。对于您希望配置的内容,请使用“设置”,因为它会自动生成App.config的配置块。如果您不想使用默认值,则仍需要手动复制和粘贴这些值。
两者的好处是VS将构建一个很好的静态类,其中包含可在整个代码中使用的属性。只要您继续使用向导,VS就会动态维护类和资源。
答案 1 :(得分:1)
我通常会将它们声明为常量,或者,如果我有相关字符串组,我将创建一个枚举。
无论哪种方式,至少他们都附有一个描述性名称(而不是使用“魔术字符串”),并且它们的使用始终是一致的。
答案 2 :(得分:1)
过去,我使用CodeRush(或您最喜欢的重构工具)转换为类中的const字符串,然后将所述const字符串移动为它们所适用的实体类的公共成员。
这里的真正答案是,如果你想在重构时让你的代码变得不那么脆弱,那就是退出字符串业务,并使用Linq 4 /到NHibernate,但是你必须研究它是否是完整性足以满足您的目的。
答案 3 :(得分:1)
意识到我可以用Expression树的方式做到这一点。使用Code作为数据!
像这样的东西
protected IList<T> _FindByProperty<TResult>(Expression<Func<T, TResult>> expression, TResult value)
{
return _FindByProperty((expression.Body as MemberExpression).Member.Name, value);
}
IList<User> costCenters = _FindByProperty( user=> user.Name, "name");
这与expression-trees标记中的很多问题有关。
答案 4 :(得分:0)
我使用与Cherian类似的方法。我从FluentNhibernate的ReflectionHelper中得到了我的想法。
原则是使用表达式树然后你可以放入一个x =&gt; x.Status表达式。该方法将属性名称返回为字符串。
事实上,你也可以只使用FluentNHibernate?但是,我不知道他们的查询模型是否作为映射接口均匀扩展......