2011-07-12 68 views
0

我需要通過PropertyInfo來分配值。使用PropertyInfo將值分配給包含自定義索引器的包裝類

當屬性的類型是我的自定義類(一個包含字典的封裝器,旨在包含同一文本的多個語言版本)時,我遇到了一些問題。

它看起來像:

public class MultilingualString 
    {    
     Dictionary<string, string> Versions; 
     public string this[string languageCode] 
     { 
      get 
      { 
       if (Versions.Keys.Contains(languageCode)) 
       { 
        return Versions[languageCode]; 
       } 
       return null; 
      } 
      set 
      { 
       if (Versions.Keys.Contains(languageCode)) 
       { 
        Versions[languageCode] = value; 
       } 
       else 
       { 
        Versions.Add(languageCode, value); 
       } 
      } 
      // [blah blah other stuff...]  
     } 

左右;現在我有這個PropertyInfo對象 - 和一個字符串值,我想用默認的語言代碼分配。

certainPropertyInfo.SetValue(
    instance, // an instance of some class exposing a MultilingualString type property 
    someString, 
    new[] { "eng" }); // some default language code 

這會引發異常。

我猜最後一個參數SetValue是爲了收集索引,它不適用於自定義索引器。

切實我想要做的是,明明:

instance.msProperty["eng"] = someString; 

但我只給msProperty的名字,這就是爲什麼我使用反射。

到目前爲止,我還想過實現一個隱含的經營者(MultilingualString類中),允許字符串值轉換爲MultilingualString ...但我可以看到一些問題,這種做法如。這個靜態運算符幾乎沒有辦法「知道」默認語言代碼是什麼。

我可以通過反射實現我的目標嗎?

+0

你有沒有PropertyInfo對象?如果你這樣做,你是如何得到這個物體的?你確定你有合適的嗎? –

+0

另外,你爲什麼需要使用反射? –

+0

我知道對象的類型,我動態地調用它(使用Activator)並用DataTable中的數據填充它。我正在開發的應用程序的用戶應該將DataTable列映射到我的業務類的不同屬性。 –

回答

3

索引器是它自己的一個屬性。你需要得到實例的索引器屬性在你的某些屬性:

var multilingualString = certainPropertyInfo.GetValue(instance, null); 
multilingualString.GetType().GetProperty("Item").SetValue(multilingualString, 
                  someString, 
                  new object[]{ "eng" }); 

Item是索引屬性的默認名稱。

如果您使用的是.NET 4.0中,你可以使用新的dynamic類型:

dynamic multilingualString = certainPropertyInfo.GetValue(instance, null); 
multilingualString["eng"] = someString; 
+0

就像你的.NET 4.0解決方案......以前從未想過它。 –

+0

但是你真的需要首先使用'GetValue'嗎?你不能只運行'dynamic multiStr = instance; multiStr [「主機」] = someString;' –

+0

的GetValue至少需要兩個參數,第二個是「任選的索引值」,它在任何情況下返回null。我在.NET 3.5上,所以我不能使用動態。 –