如何找出在运行时用C#加载/执行的私有/公共类、属性和方法
本文关键字:方法 属性 运行时 何找出 执行 加载 | 更新日期: 2023-09-27 18:19:28
我正在尝试使用反射来使用Windows 8 Store应用程序的WebView代理。问题是,我无法确定WebView是否有用于默认代理的私有方法或私有属性。
我知道安卓有一种使用反射来更新WebView的方法:WebView安卓代理
然而,由于Android是开源的,因此更容易查看它在后端使用的方法/对象。
对于.NET Windows应用商店API,有什么方法可以做到这一点吗?也许可以使用反射在运行时加载类。
甚至可以浏览实现,但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 的试用版