在我的C#项目中,我依赖于第三方库。现在我想为我的项目编写一个自动验收测试。但是,要调用测试,我需要第三方库中的类的实例。使用反射我设法设置值,因为我需要它们除了一个。
以下是我遇到问题的相关课程:
public class SystemResults
{
// There must be something like this. However I cannot see it as it is private.
private List<Positions> xyz = new List<Positions>();
public IList<Positions> Positions
{
get
{
return xyz;
}
// This property does not have a set method
}
}
这是我到目前为止所尝试的内容:
private void InitSystemResults(Type trueSysResType, SystemResults sysRes)
{
List<Position> positions = ImporterTools.GetPositions(PositionsCsv);
trueSysResType.GetProperty("Positions").SetValue(sysRes, positions); // ==> Here I get an exception
}
当我调用SetValue()
方法时,抛出以下异常。
System.ArgumentException:找不到属性集方法。
根据这些信息,我发现,该课程必须如上所述。
现在我想继续讨论这个问题。当我访问sysRes.Positions
我的positions
由get方法返回时,有没有人知道如何实现这一目标?或者有没有办法改变get方法?
答案 0 :(得分:2)
您可以使用BindingFlags.NonPublic
,
FieldInfo[] fields = typeof(SystemResults).GetFields(
BindingFlags.NonPublic |
BindingFlags.Instance).ToArray(); // gets xyz and the other private fields
List<int> testResults = new List<int>() { 1,23,4,5,6,7}; // list of integer to set
SystemResults sysres = new SystemResults(); // instance of object
fields[0].SetValue(sysres, testResults); // I know that fields[0] is xyz (you need to find it first),
// sets list of int to object
希望有所帮助,
答案 1 :(得分:0)
{get;}
只有属性可以有一个支持字段,但Positions
可能会返回一些完全不同的东西(不是支持字段的值,但可能是函数的结果)。
您的代码可以接受您可以模拟的ISystemResults
,在实际代码中,您可以拥有一个内部调用第三方代码的类SystemResultsFacade
。