- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的插件代码中,我使用了早期绑定(bind)实体(通过 crmsvcutil 生成)。在我的代码中,我使用 MemberExpression 来检索属性的名称。例如,如果我想要启动插件的用户的全名,我会执行以下操作
SystemUser pluginExecutedBy = new SystemUser();
pluginExecutedBy = Common.RetrieveEntity(service
, SystemUser.EntityLogicalName
, new ColumnSet(new string[] {Common.GetPropertyName(() => pluginExecutedBy.FullName)})
, localContext.PluginExecutionContext.InitiatingUserId).ToEntity<SystemUser>();
GetPropertyName的代码如下
public static string GetPropertyName<T>(Expression<Func<T>> expression)
{
MemberExpression body = (MemberExpression)expression.Body;
return body.Member.Name.ToLower();
}
RetrieveEntity的代码如下
public static Entity RetrieveEntity(IOrganizationService xrmService, string entityName, ColumnSet columns, Guid entityId)
{
return (Entity)xrmService.Retrieve(entityName, entityId, columns);
}
我的解决方案架构师的评论:
与其像上面那样编写代码,不如这样写(硬编码字段名称 - 或者使用结构)。
SystemUser pluginExecutedBy = null;
pluginExecutedBy = Common.RetrieveEntity(service
, SystemUser.EntityLogicalName
, new ColumnSet(new string[] {"fullname"})
, localContext.PluginExecutionContext.InitiatingUserId).ToEntity<SystemUser>();
原因:
new
关键字实例化对象以便将其与我的 GetProperty 方法一起使用)这是糟糕的编程习惯。在我的代码中,我从未使用过 new
关键字,只是对其进行强制转换,而强制转换不会创建新对象。 现在,我不是 C# 或 .NET 方面的专家,但我喜欢阅读和尝试不同的东西。因此,我查找了 Microsoft.Xrm.Sdk.dll,发现 Sdk 中的 ToEntity 实际上确实使用关键字 new
创建了一个新实体。问题
我的代码写得不好吗?如果是这样,为什么?如果更好-为什么? (我相信这样会干净很多,即使字段名发生变化,只要重新生成早期绑定(bind)的类文件,我也不必重新编写任何代码)
我同意强制转换不会创建新对象,但我的代码是否会不必要地创建对象?
有没有更好的方式(完全不同的第三种方式)来写代码?
注意:我建议使用 GetPropertyName,因为他在他的所有代码中都对属性名称进行了硬编码,因此在一个不使用早期绑定(bind)实体的不同项目中,我使用结构作为属性名称 - 如下所示。我在 CRM 2011 的新工作中做了这 3 周,但后来发现了 MemberExpression 的魔力.他正在为他在他的插件中使用的每个实体编写一个巨大的 cs 文件,我告诉他他不必做任何这些因为他可以在他的插件中使用我的 GetPropertyName 方法并获取所有必需的字段和提示此代码审查评论。通常他不做代码审查。
public class ClientName
{
public struct EntityNameA
{
public const string LogicalName = "new_EntityNameA";
public struct Attributes
{
public const string Name = "new_name";
public const string Status = "new_status";
}
}
}
PS:还是花在分析上的问题/时间不值得?
最佳答案
早绑定(bind)、晚绑定(bind)、MemberExpression、bla bla bla :)
我能理解“哲学”,但看着你的代码,我的脑海中弹出了一个巨大的警报:
public static Entity RetrieveEntity(IOrganizationService xrmService, string entityName, ColumnSet columns, Guid entityId)
{
return (Entity)xrmService.Retrieve(entityName, entityId, columns);
}
如果找不到记录,Retrieve
会抛出异常。
关于其他的东西,GetPropertyName
没问题,但总是选择,例如我尝试在插件中使用 always late bound,也许在一个项目中我更喜欢使用 early bound,经常出现解决问题的方法不止一种。
快乐的 crm 编码!
关于c#-4.0 - CRM 2011 插件 - 将早期绑定(bind)实体用于属性名称是否会导致内存问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16288716/
我正在为从 API 级别 8 到 14 的 android 开发一个应用程序。我正在尝试在早期版本中获得与 android 4(请参阅联系人应用程序)相同的快速滚动行为(右侧固定的时尚滚动条)边)。有
早期(编译期)优化 jvm的编译器可以分为三个编译器: 前端编译器:把*.java转变为*.class的过程。如sun的javac、eclipse jdt中的增量式编译器(ecj)
苹果终于推出了所谓的auto-renewable subscriptions昨天。由于我在应用内购买方面的经验很少(仅限沙盒),所以我不确定我在这里是否一切顺利。似乎需要对收据进行服务器端验证。找出订
已结束。此问题不符合 Stack Overflow guidelines .它目前不接受答案。 要求代码的问题必须表明对正在解决的问题的最低理解。包括尝试的解决方案、它们为什么不起作用以及预期结果。另
在 Wagner 的“Effective C#”第 23 项中,他解释说 interface methods are not virtual...they are a declaration of a
我最近遵循了本指南 Installing a Git Server using Apache (WebDAV) on Ubuntu Server 12.04使用 Apache (WebDAV) 设置本
这是我之前的问题 jQuery UI hiding not taking effect for early DOM elements 的后续问题。我几乎刚刚编辑了那个,但不想使 the accepte
我正在尝试替换 ZonedDateTime.toInstant方法,因为它仅从 API 26 for Android 开始可用。 但我的应用程序应该支持 API 19。 我想将 ZonedDateTi
我的电脑正确配置了 SSH,我在尝试克隆存储库时遇到了这个错误: 我运行这个命令来克隆存储库 git clone ssh://git-codecommit.us-west-2.amazonaws.co
我是一名优秀的程序员,十分优秀!