使用反射向字典添加值

3

我有一个类

class a
{  
    private Dictionary <int , string> m_Dict = new Dictionary<int , string>();
}

从其它组件/类需要使用反射向m_Dict字典添加值!我该怎么做?我搜索并尝试了,但没有成功。


4
反思?给一个人一把锤子,所有的东西看起来都像钉子!... - Mitch Wheat
2个回答

5

由于字典类没有实现 IList(这是我在前几天抱怨的问题),所以使用起来很麻烦。实际上这取决于你拥有哪些资源。对于int/string类型的 Add 方法,解决起来还是比较容易的。但是如果你需要处理常规列表反射,你将需要来自ICollection<KeyValuePair<int,string>>Add 方法。

标准用法:

object data = new Dictionary<int, string>();
object key = 123;
object value = "abc";
var add = data.GetType().GetMethod("Add", new[] {
          key.GetType(), value.GetType() });
add.Invoke(data, new object[] { key, value });

3

我猜你想访问私有成员"m_Dict"?

a x = new a();

Dictionary dic = (Dictionary) x.GetType()
                  .GetField("m_Dict",BindingFlags.NonPublic|BindingFlags.Instance)
                  .GetValue(x);

// do something with "dic"

但这是非常糟糕的设计


同意,但在这之前尝试为EWS Managed API编写一些单元测试。 - jolySoft
我发现在将Firebase Database Unity SDK中的模棱两可的Dict<string,int>键值对序列化为Dict<string,ObscuredInt>(以打败大多数内存黑客)时,这很有用。 尽管有您的评论,但我仍然稍微担心这是不良设计。我应该发一个问题吗?我感觉随着Firebase移动应用程序的普及,通过反射进行自定义对象序列化并进行类型转换是必要的恶。 - PathToLife

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接