我需要通过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…但是我可以看到这种方法存在一些问题。这个静态操作符几乎没有办法"知道"默认语言代码是什么。
我能通过反思达到我的目标吗?
索引器是它自己的属性。你需要在你的特定属性中获取实例的indexer属性:
var multilingualString = certainPropertyInfo.GetValue(instance, null);
multilingualString.GetType().GetProperty("Item").SetValue(multilingualString,
someString,
new object[]{ "eng" });
Item
是indexer属性的默认名称。
如果你使用的是。net 4.0,你可以使用新的dynamic
类型:
dynamic multilingualString = certainPropertyInfo.GetValue(instance, null);
multilingualString["eng"] = someString;