C# 当参数数量相等时,如何使用 System.Reflection 调用私有重载方法
C# How do I invoke a private overloaded method using System.Reflection when number of arguments are equal
我有一个叫 TicketManager
的 class。这个 class 有两个私有方法 private void Validate(Ticket ticket)
和一个重载 private void Validate(TicketResponse ticketResponse)
.
当我在没有指定 Type[]
的情况下使用 BindingFlags
时,我得到了一个模糊匹配异常。
以下代码是我使用 MSTest 进行的单元测试。
//testing private validation method using reflection
[TestMethod]
[ExpectedException(typeof(TargetInvocationException))]
public void Validate_TicketResponseIsInvalid_ReturnsValidationException()
{
//Arrange
TicketManager ticketManager = new TicketManager(ticketRepository);
Ticket t = new Ticket { AccountId = 1, Text = "How do I test a private method in C#?", TicketNumber = 5 };
TicketResponse tr = new TicketResponse { Ticket = t, IsClientResponse = false, Date = DateTime.Now };
//reflection
MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate", new Type[] { typeof(TicketResponse) });
object[] parameters = {tr};
//Act
methodInfo.Invoke(ticketManager, parameters); //throws NullReferenceException
//Assert
//assertion happens using attribute added to method
}
您需要使用允许您指定 BindingFlags
的重载来指定 NonPublic
。例如:
MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate",
BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] { typeof(TicketResponse) }, null);
但是,在测试的上下文中,我想知道这是否应该实际上有一个 public API,或者至少有一个 internal
API(而不是比 private
) 并使用 [InternalsVisibleTo(...)]
让您的测试套件访问它。
我有一个叫 TicketManager
的 class。这个 class 有两个私有方法 private void Validate(Ticket ticket)
和一个重载 private void Validate(TicketResponse ticketResponse)
.
当我在没有指定 Type[]
的情况下使用 BindingFlags
时,我得到了一个模糊匹配异常。
以下代码是我使用 MSTest 进行的单元测试。
//testing private validation method using reflection
[TestMethod]
[ExpectedException(typeof(TargetInvocationException))]
public void Validate_TicketResponseIsInvalid_ReturnsValidationException()
{
//Arrange
TicketManager ticketManager = new TicketManager(ticketRepository);
Ticket t = new Ticket { AccountId = 1, Text = "How do I test a private method in C#?", TicketNumber = 5 };
TicketResponse tr = new TicketResponse { Ticket = t, IsClientResponse = false, Date = DateTime.Now };
//reflection
MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate", new Type[] { typeof(TicketResponse) });
object[] parameters = {tr};
//Act
methodInfo.Invoke(ticketManager, parameters); //throws NullReferenceException
//Assert
//assertion happens using attribute added to method
}
您需要使用允许您指定 BindingFlags
的重载来指定 NonPublic
。例如:
MethodInfo methodInfo = typeof(TicketManager).GetMethod("Validate",
BindingFlags.NonPublic | BindingFlags.Instance,
null, new Type[] { typeof(TicketResponse) }, null);
但是,在测试的上下文中,我想知道这是否应该实际上有一个 public API,或者至少有一个 internal
API(而不是比 private
) 并使用 [InternalsVisibleTo(...)]
让您的测试套件访问它。