c#反射改变获取属性的方法

时间:2017-09-06 05:11:53

标签: c# reflection

在我的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方法?

2 个答案:

答案 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

enter image description here

希望有所帮助,

答案 1 :(得分:0)

{get;}只有属性可以有一个支持字段,但Positions可能会返回一些完全不同的东西(不是支持字段的值,但可能是函数的结果)。

您的代码可以接受您可以模拟的ISystemResults,在实际代码中,您可以拥有一个内部调用第三方代码的类SystemResultsFacade