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