【发布时间】:2014-03-27 22:42:24
【问题描述】:
动机
我有一个插件,它通过复制旧实体字段并以各种方式更新新实体字段来更新实体。我的问题是并非所有字段都以相同的方式更新。例如,并非所有日期的年份都增加 1。一半,最后两个季度被复制或清除。我正在为 CRM 2011 使用早期绑定的实体类。我想利用这些类以一种编译时安全的方式将实体的字段分组到列表中。给定任何 entity.FieldName,我可以提取 AttributeCollection 的字符串键。现在我需要一些构造、语法糖化、C#中的东西——我还没有找到能够将这些字段的访问链接到字符串键名提取器中。 (希望我的示例希望代码可以消除任何混淆)。
实体表单的同一部分中相同类型的字段通常具有相同类型的更新,但该逻辑顺序在早期绑定类中不可用。例如,某个可折叠菜单中的所有日期字段都被清除,但实体类不知道表单级别的分组,因为它都是 XML。
我可以遍历新旧实体的 Attributes 集合,比较每个匹配键的值,并显示差异,但我认为这需要太多手动验证。它不能进行良好的自动化测试。
我真正想做的事
我希望能够只指定已更新的字段,而不必为实体的 AttributeCollection 字典键入字符串键。我希望我可以从 VB 中借用或找到相应的语法(using 语法)或类似于通过点表示法对实体字段的链式调用(参见代码示例)。
这是我想做的一个示例
感谢 this question 提供的 GetPropertyName 方法。太好了!也许需要稍微改变 lambda 以获取多个参数...
// Gets the string name of whatever object or class property is passed in a lambda
// Usage: GetPropertyName( () => someObject.Property ); ==> "Property"
public string GetPropertyName<T>(Expression<Func<T>> propertyLambda)
// normal use of GetPropertyName is quite helpful
// assume early_bound_entity has fields: name, start_date, end_date, and currency
var e = new early_bound_entity();
string s = GetPropertyName( () => e.start_date); // s => "start_date"
// The "block" I do inside of GetPropertyName is what I am hoping to be able to do!
// i.e. pass as many System.Reflection.MemberInfo instances to GetPropertyName as I can
// I really want to NOT have to say e.field, e.anotherfield, ... but C# does not have VB's using syntax :(
List<string> fieldsShouldHaveCopied = GetPropertyName( (early_bound_entity e) => e.name, e.start_date, e.end_date, e.currency );
// fieldsShouldHaveCopied => { "name", "start_date", "end_date", "currency" }
为什么会这样?
我希望我可以使用我的早期绑定实体的类定义并围绕我的早期绑定对象设置一个上下文。然后,使用其智能感知和类定义,限制将哪些字段组合在一起。我真的不想输入后期绑定的 Entity.Attributes 字符串键,因为这样维护起来会很糟糕——没有智能感知、没有编译时验证、字符串可能拼写错误等等。我可以检查 AttributeCollection 是否包含key first 并警告使用了错误的密钥(无论如何都会这样做),但是未来的开发人员将被困在维护“手写”字符串文字列表中。 当我通过 early_bound_entity 字段传递某种表达式链接时,我希望 GetPropertyName 方法生成这些字符串列表,我希望从代码示例中可以清楚地看到这一点。
如果我滥用术语块、闭包和 lambda,我很抱歉,只要我提到它们中的任何一个,就将它们组合在一起。
另外,直接告诉我这是不是一个[愚蠢|可怕|等等]的想法,并告诉我为什么!我面临着必须通过点符号(甚至是它们的字符串键)输入约 300 个字段访问器来验证它们是否已更新的前景。很有可能这个实体太大了,但遗憾的是现状。
谢谢!
【问题讨论】:
-
您这样做只是为了引用后期绑定实体中的属性名称吗?
-
是的,我是。我知道我可以将后期绑定的字段作为字符串输入,并在尝试使用它们之前检查它们是否在 Attributes 字典中。但我认为这很难维持。至少这种方式有某种编译时安全的方式来访问它们。也许是环形交叉路口。
标签: c# unit-testing dynamics-crm-2011