当前位置: 首页 > 编程语言 > C#

C#反射:是否可以在运行时找到一个对象的实例?分享

时间:2023-04-11 01:39:57 C#

C#反射:是否可以在运行时找到一个对象的实例?我想知道是否可以使用反射在运行时定位对象?这更像是一个实验,而不是实际需求。我在对象实例上使用.GetType()方法对对象执行各种操作,但我的问题是:如果我知道某个类型的对象在运行时存在,但我不能通过它的名称来引用它。作为一个更具体的示例,假设我有一个加载DLL的WinForms应用程序-该DLL如何独立定位对表单对象的引用以便与表单交互或调用公共方法?这可能吗?不,基本上。您可能有某种从类型到“我感兴趣的类型的实例”的可怕的全局映射,但没有。基本上,WinForms应用程序应该以某种方式将对表单的引用传递给DLL。这是不可能的,因为引用是由Microsoft私下实现的,与C/C++相比它们不是指针,在旧的C/C++中你可以扫描你的内存,但在.NET中没有这样的工具。您可以为您的应用程序设计一个插件框架。这是一个示例:publicinterfaceIPlugin{voidLoad(FormmainForm);//或者你可以为你的主窗体提供一个接口,允许你的插件与你的窗体一起工作。然后你可以在运行时加载你的程序集,当找到你的插件。foreach(vartypeinassembly.GetTypes()){if(typeof(IPlugin).IsAssignableFrom(type))varplugin=(IPlugin)Activator.CreateInstance(type);plugin.Load(_mainForm);}更新:顺便说一句,据我所知,你的问题的答案是否定的正如其他人已经回答的那样,不,这是不可能的。但是,对于更具体的情况,您可以从WinAPI获取所有Windows的列表,然后检查每个Windows以查找您要查找的属性。publicstaticclassHelper{publicstaticIntPtr[]GetToplevelWindows(){ListwindowList=newList();GCHandlehandle=GCHandle.Alloc(windowList);尝试{Helper.EnumWindows(Helper.EnumWindowsCallback,(IntPtr)handle);}最后{handle.Free();}返回windowList.ToArray();}privatedelegateboolEnumWindowsCallBackDelegate(IntPtrhwnd,IntPtrlParam);[DllImport("user32.Dll")]privatestaticexternintEnumWindows(EnumWindowsCallBackDelegatecallback,IntPtrlParam);privatestaticboolEnumWindowsCallback(IntPtrhwnd,IntPtrlParam){((List)((GCHandle)lParam).Target).Add(hwnd);返回真;如果您只是尝试并尝试从DLL中找到主窗口体,您可以这样做://getthecurrentprocessSystem.Diagnostics.Processp=System.Diagnostics.Process.GetCurrentProcess();//获取它的主窗口句柄(仅在窗体已经创建的情况下有效)IntPtrhWnd=p.MainWindowHandle;//通过其本机句柄定位窗体System.Windows.Forms.Formf=System.Windows.Forms.Form.FromHandle(hWnd)作为System.Windows.Forms.Form;刚刚测试了依赖程序集,而不是动态加载的程序集,但值得一试。对于定位特定实例的一般问题,问题已经得到解答。JonSkeet是正确的,任何类型都不可能。对于您的具体示例,这是可能的。而且你不需要p/invokeEnumWindows或使用Form.FromHandle()以上是C#学习教程:C#reflection:Isitpossibletofindaninstanceofanobjectatruntime?分享的所有内容,如果对你有用,需要了解更多C#学习教程,希望大家多多关注—Formf=Application.OpenForms.Where(x=>x.GetType().Name=="FormIWant").FirstOrDefault();本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: