未找到 C# 反射异常方法

标签 c# reflection dynamics-crm-2011

您好,我正在开发 CRM 2011 插件,我遇到了反射类型问题。我已经生成了 Entities 类,并且我知道该属性存在于该类型中,但是当我尝试获取它的值时,我收到关于未找到方法的异常。最愚蠢的部分是它在我的机器上完美运行但在客户端上不起作用。

这是我的代码(我需要从实体中获取所有 OptionSet 并对它们执行操作):

public override void MyExecute()
        {
            var fse = TargetEntity.ToEntity<Equipment>();
            Type equiptmentType = fse.GetType();
            TracingService.Trace("FSE object type: {0}", equiptmentType.FullName);
            IEnumerable<PropertyInfo> optionSetsProperties = equiptmentType.GetProperties()
                .Where(x => x.PropertyType == typeof(OptionSetValue)).ToList();  //I'm getting this property from the object type so it must exist.


            foreach (var optionSetsProperty in optionSetsProperties)
            {   
                TracingService.Trace("Resolving ResourceGroup on property: {0}", optionSetsProperty.Name);
                ResolveResourceGroupBySkill(optionSetsProperty, fse);
                TracingService.Trace("Resoloving ResourceGroup finished");
            }

        }

private void ResolveResourceGroupBySkill(PropertyInfo optionSetsProperty, Equipment fse)
        {
            try
            {
                TracingService.Trace("Trying to get value of: {0}", optionSetsProperty.Name);

                OptionSetValue skillLevel = (OptionSetValue)optionSetsProperty.GetValue(fse);
                TracingService.Trace("Value equals: {0}", skillLevel);

            }
            catch (Exception ex)
            {
                TracingService.Trace("An error occured: {0}", ex.Message);
                Exception inner = ex;
                while (inner != null)
                {
                    TracingService.Trace(inner.Message);
                    inner = inner.InnerException;
                }
                throw new InvalidOperationException(String.Format("Cannot get value of skill level from property: {0}", optionSetsProperty.Name), ex);
            }
        }

这是日志详细信息:

Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Method not found: 'System.Object System.Reflection.PropertyInfo.GetValue(System.Object)'.Detail: 
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
  <ErrorCode>-2147220891</ErrorCode>
  <ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
    <KeyValuePairOfstringanyType>
      <d2p1:key>OperationStatus</d2p1:key>
      <d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
    </KeyValuePairOfstringanyType>
  </ErrorDetails>
  <Message>Method not found: 'System.Object System.Reflection.PropertyInfo.GetValue(System.Object)'.</Message>
  <Timestamp>2014-09-11T12:58:09.2941554Z</Timestamp>
  <InnerFault i:nil="true" />
  <TraceText>

[OC.CSSFieldService: OC.CSSFieldService.ServiceActivity.MyPlugin]
[424ad2a7-ea29-e411-be7f-00155d0aa109: OC.CSSFieldService.ServiceActivity.MyPlugin: Create of equipment]
FSE object type: OC.Data.Equipment
Resolving ResourceGroup on property: oc_ExpeCommHyper

</TraceText>
</OrganizationServiceFault>

如您所见,即使跟踪行“尝试获取值(value)”也不起作用。没有捕获异常...我不知道该怎么办。有什么想法吗?

最佳答案

好吧,我明白了。服务器安装了 Microsft .NET 4.0,我安装了 .NET 4.5。

在 .NET 4.5 中有一个新的 PropertyInfo.GetValue 方法重载 - 它是 PropertyInfo.GetValue(object obj) 因为在 4.0 中只有 PropertyInfo.GetValue(object obj, object[] indexer)

我只需要更换:

 OptionSetValue skillLevel = (OptionSetValue)optionSetsProperty.GetValue(fse);

OptionSetValue skillLevel = (OptionSetValue)optionSetsProperty.GetValue(fse, null);

非常有效!

关于未找到 C# 反射异常方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25788515/

相关文章:

C#/Mono Console.In.ReadToEnd() 停止进程

.net - 为什么此插件代码中的 CRM 2011 实体关系为空?

asp.net-web-api - 对于 fetchXml 查询类型,请求 URL 太长

c# - 如何刷新实体主页 View 上的列表

c# - C#中的反射修改类中的私有(private)常量字段

c# - 启用 JavaScript 单击事件的按钮不起作用

c# - 在我们的解决方案中将 Entity Framework 放在哪里?

c# - Visual Studio 2017 Docker 支持不适用于 ASP.Net Core Angular 或 React 项目

c# - 我可以更改 C# 中常量的值吗?

java - 如何通过 java.lang.reflect.Type 创建实例