использование PropertyInfo для присвоения значения классу-оболочке с помощью пользовательского индексатора - PullRequest
0 голосов
/ 12 июля 2011

Мне нужно присвоить значение через 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 ... но я вижу некоторые проблемы с таким подходом, например.этот статический оператор вряд ли мог бы «знать», какой код языка по умолчанию.

Могу ли я достичь своей цели с помощью отражения?

1 Ответ

3 голосов
/ 12 июля 2011

Индексатор является собственным свойством.Вам нужно получить свойство индексатора экземпляра в этом вашем определенном свойстве:

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

Item - это имя по умолчанию для свойства индексатора.

Если вы используете .NET4.0, вы можете использовать новый тип dynamic:

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