0

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 クラス内に) 実装することを考えてきましたが、そのアプローチにはいくつかの問題があります。この静的演算子には、デフォルトの言語コードが何であるかを「知る」方法はほとんどありません。

リフレクションによって目標を達成できますか?

4

1 に答える 1

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;
于 2011-07-12T14:40:53.427 に答える