我使用反射来设置属性Microsoft.Xrm.Sdk.Messages.UpsertResponse.Target
,但我失败了。代码如下:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Messages;
using System;
using System.Reflection;
using System.Runtime.Serialization;
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
/*DemoClass instance = new DemoClass();*/
UpsertResponse instance = new UpsertResponse();
Console.WriteLine("readonly value : {0}", instance.Target);
string propName = "Target";
EntityReference propValue = new EntityReference();
propValue.Id = Guid.NewGuid();
changeProperty(instance, propName, propValue);
Console.WriteLine("new value : {0}", instance.Target.Id);
Console.ReadKey();
}
public static void changeProperty(Object instance, string propName, Object propValue)
{
var field = instance.GetType().GetField("<" + propName + ">k__BackingField", BindingFlags.Instance | BindingFlags.NonPublic);
field.SetValue(instance, propValue);
}
}
public class DemoClass
{
public EntityReference Target { get; }
}
}
CCD_ 2类似于具有CCD_ 4性质的CCD_。changeProperty
使用反射来处理变更实例的属性。函数changeProperty
中抛出NullPointerException,因为fieldInfo
是null
。但当我使用带注释的DemoClass instance = new DemoClass();
时,它的工作原理很好。我该如何解决这个问题?有办法设置UpsertResponse
吗?
您认为UpsertResponse.Target
从后备字段<Target>k__BackingField
返回值的假设是错误的。
如果你反编译Microsoft.Xrm.Sdk.dll,你会看到类似的东西
public EntityReference Target
{
get
{
if (base.Results.Contains("Target"))
{
return (EntityReference)base.Results["Target"];
}
return null;
}
}
因此,要操作Target
的值,必须修改Results
集合。正如评论中所写的,这可以由完成
response.Results.AddOrUpdateIfNotNull("Target", entityReference);