C#为什么反射无法设置Microsoft.Xrm.Sdk.Messages.UpsertResponse



我使用反射来设置属性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,因为fieldInfonull。但当我使用带注释的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);

最新更新