2014-09-11 92 views
4

嗨我正在開發CRM 2011插件,我有反射類型的問題。我已經生成了實體類,我知道該屬性存在於類型中,但是當我試圖獲取它的值時,我收到了有關未找到方法的異常。最愚蠢的部分是,它在我的機器上完美工作,但不適用於客戶端。C#反射異常方法未找到

這裏是我的代碼(我需要從實體的所有OptionSets並對其進行操作):

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> 

正如你可以看到,即使跟蹤「嘗試獲取價值」行不起作用。沒有發現異常......我不知道該怎麼做。有什麼想法嗎?

回答

6

好吧我想通了。服務器安裝了Microsft .NET 4.0,並且有.NET 4.5。

在.NET 4.5有一個爲PropertyInfo.GetValue方法的新的過載 - 它是PropertyInfo.GetValue(obj對象),因爲在4.0僅存在PropertyInfo.GetValue(obj對象,對象[]索引)

我只需要替換:

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

OptionSetValue skillLevel =(OptionSetValue)optionSetsProperty.GetValue(FSE,NULL);

工作就像一個魅力!