创建私有类的实例并设置只读属性

问题描述 投票:0回答:1

我需要在我的公共类中测试一个公共方法,但是该方法的输入是一个私有嵌套类。因此,我需要创建此私有嵌套类的实例,以对my方法进行适当的测试。

此嵌套类具有由构造函数设置的属性,并且有一个表达式增强成员定义的只读属性,该成员从构造函数设置的属性中提取一些信息。

我设法通过反射创建了私有类的实例。我现在正在尝试获取Backfield来设置此属性的值。但是,当我得到后场时,它返回null。特别是当我尝试使用字符串列表设置背景字段的值时,它给了我一个空引用异常。

可以做,我想做什么?这是一些伪代码:

public class Class1
{
   private class Class2
   {
      public SomeClass Input { get; }
      public List<string> GetInformation => Input.something.something...

      public Class2 (someClass input)
      {
         Input = input;
      }
   }

   public void someMethod(Class2 input)
   {
       List<string> info = input.GetInformation();

       some code here ...
   }
}

public class TestClass
{
   public void testingSomeMethod
   {
       List<string> list = new List<string> { "1", "2", "3" };

       //need instance of Class2 to invoke someMethod

       var typeOfClass2 = typeof(Class1)
         .GetNestedType("Class2", BindingFlags.NonPublic | 
         BindingFlags.Instance);

       var instanceOfClass2 =  
          Activator.CreateInstance(typeOfClass2,true);

      // null reference exception here. GetProperty return null.
      instanceOfClass2
        .GetType()
        .GetProperty("<GetInformation>k__BackingField", BindingFlags.NonPublic | 
            BindingFlags.Instance)
        .SetValue(instanceOfClass2, list);
   }

}
c# reflection
1个回答
0
投票

我使方法public能够测试方法

这不是您决定成员可访问性的方式。如果适合外部使用者,则方法为public。否则,您将尝试测试类的内部实现细节,这令人担忧,并指出可能的设计味道-如果该部分非常重要,以至于需要进行单独的单元测试,那么也许它执行的功能与是Class1的责任还是更可重用的组件,应提取到实际的单独internal类中? You can (and should) test internal classes using the InternalsVisibleToAttribute

© www.soinside.com 2019 - 2024. All rights reserved.