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

时间:2013-06-21 14:09:50

标签: c# .net reflection windows-store-apps

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

我知道android有一种使用反射来更新WebView的方法:WebView android proxy

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

有没有办法为.NET Windows Store API执行此操作?也许使用反射来获取在运行时加载的类。

2 个答案:

答案 0 :(得分:0)

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

甚至可以浏览实现,但Visual Studio无法执行此操作。您可以使用Reflector工具来实现此目的。我不知道Reflector的免费软件模拟,ildasm除外。

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

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

答案 1 :(得分:0)

使用Windows应用商店API无法设置绑定标志。但是我确实找到了一种解决方法,您需要创建一个新项目:可移植类库,它针对.NET 4+和Windows Store 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 Express无法创建可移植类库。我使用的是Visual Studio 2012 Ultimate的试用版