在 C# 交互式中执行私有方法 window
Execute private method in C# interactive window
是否存在从 C# 交互式 window 中执行 private 方法的任何逃避程序?
也就是说,假设我有一个像这样的简单 class:
public class MyClass
{
private static string SayHello()
{
return "Hello";
}
public static string SayBye()
{
return "Bye";
}
}
在 Visual studio 中,我可以单击 "Initialize Interactive with project",然后我可以访问并调用 SayBye()
方法,如下例所示:
> MyClass.SayBye()
"Bye"
还有什么方法可以访问 SayHello()
私有方法吗?这在出于测试目的的开发过程中很有用。
写 > MyClass.SayHello()
可能在交互式 window 中确实有效,你试过了吗?
如果没有,您可以执行 SayHello
,就像您尝试通过普通代码执行它时一样 - 使用反射。您可能会在交互式提示中写入如下所示的内容:
typeof(MyClass)
.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Static)
.Invoke(null, new object[0]);
您需要根据方法所在的位置更改绑定标志和调用方法参数。 (BindingFlags.Instance
对比 BindingFlags.Static
等)
候补:
如果使用实例对象(非静态),则存在几种使用 dynamic
的魔法公开私有成员的实现。如果你做一个 google 搜索你可以找到这个的实现(或者你自己写一个)。
这将允许您编写如下代码:
(new PrivateExposerObject(myClass)).SayHello();
是否存在从 C# 交互式 window 中执行 private 方法的任何逃避程序?
也就是说,假设我有一个像这样的简单 class:
public class MyClass
{
private static string SayHello()
{
return "Hello";
}
public static string SayBye()
{
return "Bye";
}
}
在 Visual studio 中,我可以单击 "Initialize Interactive with project",然后我可以访问并调用 SayBye()
方法,如下例所示:
> MyClass.SayBye()
"Bye"
还有什么方法可以访问 SayHello()
私有方法吗?这在出于测试目的的开发过程中很有用。
写 > MyClass.SayHello()
可能在交互式 window 中确实有效,你试过了吗?
如果没有,您可以执行 SayHello
,就像您尝试通过普通代码执行它时一样 - 使用反射。您可能会在交互式提示中写入如下所示的内容:
typeof(MyClass)
.GetMethod("SayHello", BindingFlags.NonPublic | BindingFlags.Static)
.Invoke(null, new object[0]);
您需要根据方法所在的位置更改绑定标志和调用方法参数。 (BindingFlags.Instance
对比 BindingFlags.Static
等)
候补:
如果使用实例对象(非静态),则存在几种使用 dynamic
的魔法公开私有成员的实现。如果你做一个 google 搜索你可以找到这个的实现(或者你自己写一个)。
这将允许您编写如下代码:
(new PrivateExposerObject(myClass)).SayHello();