【问题标题】:Using GetAttributeValue<T> Dynamically in CRM Online在 CRM Online 中动态使用 GetAttributeValue<T>
【发布时间】:2016-03-06 20:25:20
【问题描述】:

我运行 C# 代码来比较 CRM 中的前后图像以确定字段是否发生更改(长话短说:我无法控制的外部过程每次都更新记录上的每个字段,即使字段没有t 改变)。我想使用 CRM GetAttributeValue(attributeName) 来执行此操作,但是当我可能不知道字段名称时,我想动态执行此操作。所以,例如,我想这样做:

// pretend the value of firstname is not hard-coded but submitted on a form    
// (not really on a form, but just know it's not hard-coded like it is below.)
string fieldToCheck = "firstname"; 
if (preImage.GetAttributeValue<T>(fieldToCheck) != postImage.GetAttributeValue<T>(fieldToCheck))
{
  // do something here. I've tried something like the below, but it doesn't work with error "t is a variable but used like a type". 
  Type t = preImage.Attributes[fieldToCheck].GetType();
  var val = preImage.GetAttributeValue<t>(fieldToCheck);

}

我遇到的问题是 &lt;T&gt; 可能会有所不同,具体取决于 fieldToCheck 的值。在 firstname 的情况下,它将是 &lt;string&gt;,在 new_DateOpened 的情况下,它将是 &lt;DateTime&gt;,等等。我一定是脑部痉挛,因为我应该能够弄清楚如何动态获取 T 的值,但不能。

【问题讨论】:

  • 既然你在使用 var 为什么不直接使用 GetType 呢?确定您在 fieldToCheck 中拥有的数据类型?
  • 修改了代码。 fieldToCheck 将始终是一个字符串。这只是我想要获取的 CRM 中属性的名称。

标签: c# plugins dynamics-crm


【解决方案1】:

泛型类型参数T 不等于Type 类型的实例。您可以使用typeof(T) 输入参数T -&gt; Type,但不能轻松地从Type -&gt; T 输入。通常在编译时必须知道类型 T。

您显然可以在此处使用反射 (How do I use reflection to call a generic method?):

MethodInfo method = typeof(Entity).GetMethod("GetAttributeValue");
MethodInfo generic = method.MakeGenericMethod(t);
generic.Invoke(preImage, fieldToCheck); // and postImage

【讨论】:

  • 我支持这个答案,但由于某种原因,他将类型推为 var 作为匿名类型。不知道为什么。
  • 你是说他什么时候做的var fieldToCheck = "firstname"var 在该实例中并未暗示匿名类型,而是暗示了推断的字符串类型。
  • 是“”的原因,但请查看他在顶部的评论。假装代码不是硬编码的。
  • fieldToCheck 将始终是一个字符串。它表示 Microsoft CRM 中实体的属性名称。不过,名称所代表的属性可以是任何类型:字符串、日期/时间、数字、CRM 选项集等,这就是为什么我不知道该类型是什么的原因。我将沿着这条路线走下去,因为即使值没有改变,我也无法控制更新每个字段的外部进程。这导致我的 CRM 工作流程启动,因为电子邮件字段值在实际上没有改变时发生了变化 - 因此我使用前后图像进行比较。
  • Jeff 如果可行,我会使用@Henk-van-Boeijen 的答案。由于性能影响,我会尽可能避免反思。
【解决方案2】:

对于大多数(如果不是全部)属性类型,您可以依赖常见的Equals(object o) 方法。这也适用于基于类EntityReferenceOptionSetValueMoney 的属性。

您只需要对null 值进行额外检查。 (当一个属性在系统中具有null 值时,它将不会出现在前图像或后图像的属性集合中。)

public static bool IsAttributeModified(string attributeName, Entity preImage, Entity postImage)
{
    object preValue;

    if (preImage.Attributes.TryGetValue(attributeName, out preValue))
    {
        object postValue;
        return !postImage.Attributes.TryGetValue(attributeName, out postValue) || !preValue.Equals(postValue);
    }

    return postImage.Attributes.ContainsKey(attributeName);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2016-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多