Asp.net 获取程序集中每个Web窗体上的控件列表

Asp.net 获取程序集中每个Web窗体上的控件列表,asp.net,webforms,system.reflection,Asp.net,Webforms,System.reflection,是否可以使用反射获取Web窗体上存在的控件的纯文本列表?基本上,一位同事希望获得一份控制列表,以帮助定义验证策略,例如,一般来说,产品编号必须是数字,但在某些屏幕上,它们可以是字母数字。 我认为使用反射生成如下内容的列表会很简单: AddProduct.aspx txtProductNumber txtProductName etc. 我可以得到表单名称,但到目前为止还不能得到其中包含的控件。当前代码如下所示: Assembly assembly = Assemb

是否可以使用反射获取Web窗体上存在的控件的纯文本列表?基本上,一位同事希望获得一份控制列表,以帮助定义验证策略,例如,一般来说,产品编号必须是数字,但在某些屏幕上,它们可以是字母数字。 我认为使用反射生成如下内容的列表会很简单:

AddProduct.aspx
     txtProductNumber
     txtProductName
     etc.
我可以得到表单名称,但到目前为止还不能得到其中包含的控件。当前代码如下所示:

Assembly assembly = Assembly.LoadFrom(@"Filename.dll");
Type[] types = assembly.GetExportedTypes();
for (int i = 0; i < types.Length; i++)
{
    Page page = (Page)assembly.CreateInstance(types[i].FullName);
    ControlCollection controls = page.Controls;
    // At this point controls.Count = 0 presumably because the controls are defined as protected.
}
Assembly=Assembly.LoadFrom(@“Filename.dll”);
Type[]types=assembly.GetExportedTypes();
for(int i=0;i

有几个重载。例如,如果我将页面分配行更改为

Page Page=(Page)assembly.CreateInstance(类型[i]。全名,true, BindingFlags.NonPublic,null,null,null,null)

然后我得到一个关于缺少构造函数的错误

那么,我是否完全走错了路,或者我试图做的事情是否真的可能?非常感谢您的帮助


编辑:对于延迟回复此问题表示歉意。我们进一步使用Assembly.GetCallingAssembly()来生成列表,但它仍然不能完全满足我们的需要。最后,我们使用了一种更冗长的“在整个解决方案中查找”方法。

因为您只是创建每个页面的一个实例,而不是实际提供页面,我认为您的方法行不通,因为它不会让页面经历负责创建页面及其子控件的正常页面请求生命周期


如果这是一个使用asp.net framework控件的单一网站,则最好只对标记前缀执行“在文件中查找”“由于您只是创建每个页面的一个实例,而不是实际提供页面,因此我认为您的方法不会起作用,因为它不会让页面经历负责创建页面及其子控件的正常页面请求生命周期


如果这是一个使用asp.net framework控件的单一网站,您最好只对标记前缀“执行“在文件中查找”。在我看来,您正在查找在运行时创建的控件。如果您希望在运行时查找这些控件,您可以使用反射和(取决于容器)使用其他方法。您应该在
页面_Unload
事件中执行此操作,大多数控件都将在该事件中加载并仍然可用


但是,如果您试图在页面请求生命周期内不处理页面就找到这些控件,这可能会让人望而生畏。仅使用CreateInstance(或“new”)创建页面,就不会运行
page\u Load
page\u Init
或任何其他事件。它只会在构造函数中运行代码(正如您所发现的,它是受保护的,这并不意味着您不能实例化它,但经历这些麻烦不会给您带来什么)。

在我看来,您正在寻找在运行时创建的控件。如果您想在运行时找到这些控件,您可以使用反射和(取决于容器)使用其他方法。您应该在
页面_Unload
事件中执行此操作,大多数控件都将在该事件中加载并仍然可用

但是,如果您试图在页面请求生命周期内不处理页面就找到这些控件,这可能会让人望而生畏。仅使用CreateInstance(或“new”)创建页面,就不会运行
page\u Load
page\u Init
或任何其他事件。它只会在构造函数中运行代码(正如您所发现的,它是受保护的,这并不意味着您不能实例化它,但经历这些麻烦不会给您带来什么好处)