如何找出在运行时用C#加载/执行的私有/公共类、属性和方法

本文关键字:方法 属性 运行时 何找出 执行 加载 | 更新日期: 2023-09-27 18:19:28

我正在尝试使用反射来使用Windows 8 Store应用程序的WebView代理。问题是,我无法确定WebView是否有用于默认代理的私有方法或私有属性。

我知道安卓有一种使用反射来更新WebView的方法:WebView安卓代理

然而,由于Android是开源的,因此更容易查看它在后端使用的方法/对象。

对于.NET Windows应用商店API,有什么方法可以做到这一点吗?也许可以使用反射在运行时加载类。

如何找出在运行时用C#加载/执行的私有/公共类、属性和方法

Visual Studio可以显示类中声明的所有成员。将鼠标指针放在yoru代码中的类名上方,右键单击该名称,然后选择"转到防御"命令。Visual studio将创建一个临时文件,并在代码编辑器中打开它。不过,此文件将只包含成员定义。

甚至可以浏览实现,但Visual Studio无法做到这一点。您可以为此使用Reflector工具。我不知道Reflector的免费软件模拟,除了ildasm。

您也可以使用代码获取类中声明的所有成员。Type类具有GetMembers方法,允许您获取类的所有成员。使用BindingFlags指定您需要获得私有成员:

MemberInfo[] privateMembers = typeof(MyClass).GetMembers(BindingFlags.Instance | BindingFlags.NotPublic);

使用Windows应用商店API无法设置绑定标志。然而,我确实找到了一个解决方法,您需要创建一个新项目:可移植类库,它针对.NET 4+和Windows应用商店API。将此方法放在一个空类中:

public void ReflectionMagic(Object obj)
    {
        BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static;
        Type webview_type = obj.GetType();
        ConstructorInfo[] constructorinfo_arr = webview_type.GetConstructors(flags);
        MemberInfo[] memberinfo_arr = webview_type.GetDefaultMembers();
        EventInfo[] eventinfo_arr = webview_type.GetEvents(flags);
        FieldInfo[] fieldinfo_arr = webview_type.GetFields(flags);
        Type[] interfaces_arr = webview_type.GetInterfaces();
        MemberInfo[] membersinfo_arr = webview_type.GetMembers(flags);
        MethodInfo[] methodinfo_arr = webview_type.GetMethods(flags);
        Type[] nestedtypes_arr = webview_type.GetNestedTypes(flags);
        PropertyInfo[] propertyinfo_arr = webview_type.GetProperties(flags);
        Type webview_interface_type = obj.GetType().GetInterfaces()[5].GetType();
        ConstructorInfo[] constructorinfo_arr2 = webview_interface_type.GetConstructors(flags);
        MemberInfo[] memberinfo_arr2 = webview_interface_type.GetDefaultMembers();
        EventInfo[] eventinfo_arr2 = webview_interface_type.GetEvents(flags);
        FieldInfo[] fieldinfo_arr2 = webview_interface_type.GetFields(flags);
        Type[] interfaces_arr2 = webview_interface_type.GetInterfaces();
        MemberInfo[] membersinfo_arr2 = webview_interface_type.GetMembers(flags);
        MethodInfo[] methodinfo_arr2 = webview_interface_type.GetMethods(flags);
        Type[] nestedtypes_arr2 = webview_interface_type.GetNestedTypes(flags);
        PropertyInfo[] propertyinfo_arr2 = webview_interface_type.GetProperties(flags);
    }

从您的原始项目中,添加对这个可移植类库的引用,实例化该类,并使用所需对象调用方法:ReflectionMagic。

您应该能够通过进入调用ReflectionMagic的代码行来逐步完成可移植类库代码。(提示:F11-进入)

注意:Visual Studio 2012学习版无法创建可移植类库。我使用了Visual Studio 2012 Ultimate 的试用版