如何使用反射在C#中向字典添加值?

3

我有以下字典:

private Dictionary<string, double> averages = new Dictionary<string, double>();

现在我想使用反射来添加两个额外的值。我可以检索字段信息,但是还需要做什么?

FieldInfo field = ProjectInformation.SourceManager.GetType().GetField("averages");
if (field != null)
{
    //what should be here?
}

1
为什么你想要通过反射来添加值? - Tim Schmelter
@Tim Schmelter 用于单元测试目的 - anon
2
这将导致测试变得脆弱。如果可以的话,请修改您的测试或被测试系统,使得测试不需要了解实现细节。 - TrueWill
@Tim Schmelter 感谢您的回复,但是我知道。我更喜欢制作易碎测试来进行测试,而不是仅仅为了测试目的而更改代码。 - anon
3个回答

5
MethodInfo mi = field.FieldType.GetMethodInfo("set_Item");
Object dict = field.GetValue(ProjectInformation.SourceManager);
mi.Invoke(dict, new object[] {"key", 0.0} );

在获得字典的引用后,您不需要使用反射。 - jbtule
@rene 我在 FieldInfo 上找不到 GetMethodInfo(..) 方法。 - RoflcoptrException
@Roflcoptr 为了历史的缘故使用了 FieldType 属性 :-) ... 抱歉 ... - rene

4
如果您需要获取字段和值,仅用于单元测试,请考虑使用微软的PrivateObject
它可以让您在需要时检查数据成员的内部状态,这似乎是您正在尝试做的事情。
在您的单元测试中,您可以执行以下操作:
MyObject obj = new MyObject();
PrivateObject privateAccessor = new PrivateObject(obj);
Dictionary<string, double> dict = privateAccessor.GetFieldOrProperty("averages") as Dictionary<string, double>;

然后,您可以自由地从字典中获取和设置任何所需的值。

0
if(field != null)
{
   field.GetValue(instance);
}

那只会给你字典。 - rene

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