2012-12-18 81 views
1

我正在研究在此情況下從Int32到更復雜類型的鑄造。通過從簡單類型到複雜類型的反射鑄造

這裏是你將如何通過正常手段獲得這種複雜類型的實例:

OptionSetValue option = new OptionSetValue(90001111); //int value... 

現在,我試圖通過反射來做到這一點。這裏是我的方法做:

public static void SetValue(object entity, string propertyName, object value) 
    { 
     try 
     { 
      PropertyInfo pi = entity.GetType().GetProperty(propertyName); 
      Type t = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType; 
      object safeValue = (value == null) ? null : Convert.ChangeType(value, t); //Line where the exception is thrown... 
      pi.SetValue(entity, safeValue, null); 

     } 
     catch 
     { 
      throw; 
     } 

     return; 
    } 

下面是我如何使用它:

SetValue(entity, "reason", 90001111); 

「理由」是類型OptionSetValue的實體的財產。當使用它時,在上面提到的線上,我會得到這個例外:

Invalid cast from 'System.Int32' to 'Microsoft.Xrm.Sdk.OptionSetValue'. 

是因爲這兩個屬性來自不同的程序集?如果是這樣,甚至有可能做我以後的事情?

謝謝,

回答

1

您不能將整數轉換爲該類。使用下面的代碼來代替:

object safeValue = (value == null) ? null : Activator.CreateInstance(t, value); 

什麼上面的代碼確實是創造的OptionSetValue一個新的實例和值傳遞給它的構造。

+0

這很好。謝謝。 –

2

我想你回答了你自己的問題。

「理由」 是一個類型的實體的屬性OptionSetValue

如果是這樣的話,那麼pi.PropertyTypeOptionSetValue,並

Type t = Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType; 

回報OptionSetValue

無效劇集來自Convert.ChangeType(value, t)。由於OptionSetValue的轉換器尚未註冊,因此運行時不知道如何執行此轉換。如果您有興趣去那條路線,請參閱此MSDN文章how to register a TypeConverter

查看Eve的使用Activator.CreateInstance來看看如何解決這個問題。