【问题标题】:Issue Related to Assembly.GetExecutingAssembly().GetTypes() in C#与 C# 中的 Assembly.GetExecutingAssembly().GetTypes() 相关的问题
【发布时间】:2012-02-06 07:23:19
【问题描述】:

在我的网站上。我在 App_Code 中添加了一个类文件,其中包含 5 个公共类到一个命名空间中。

我想获取包含在特定命名空间中的所有类名。

在我添加的 default.aspx.cs 文件中。

var q = from t in Assembly.GetExecutingAssembly().GetTypes()
                            where t.IsClass && t.Namespace == "Sample"
q.ToList().ForEach(t => Console.WriteLine(t.Name));

但我在Assembly.GetExecutingAssembly().GetTypes() 中没有找到示例命名空间 如何访问上述代码中的'Sample'命名空间?

谢谢

【问题讨论】:

  • Sample 是整个命名空间吗?另外,您是否在页面中寻找任何类型? asp.net 中的页面通常根据需要在不同的程序集中进行编译...

标签: c# asp.net vb.net


【解决方案1】:

我认为这里的问题可能是由于这段代码是在从您的代码隐藏文件创建的临时程序集中执行的。

要检查这个:

  • 尝试仅转储程序集中可用的命名空间和类 - 例如

var q = from t in Assembly.GetExecutingAssembly().GetTypes() where t.IsClass select t; q.ToList().ForEach(t => Console.WriteLine(t.Namespace));

  • 尝试使用已知程序集而不是正在执行的程序集 - 例如typeof(Sample.Class1).Assembly

或者...只是阅读@Darin 的答案...我必须学会更快地打字!

【讨论】:

    【解决方案2】:

    在我添加的 default.aspx.cs 文件中

    这就是问题所在。当您拥有一个网站(与 Web 应用程序相反)时,您放入 App_Code 的所有代码都会在运行时动态编译到单独的程序集中。因此,当您编写Assembly.GetExecutingAssembly() 时,您基本上得到的是为您的default.aspx WebForm 生成的程序集,它与包含App_Code 中代码的程序集不同。您可以遍历项目中所有引用的程序集以查找类型。

    要获取此程序集列表,您可以在当前应用程序域上使用GetAssemblies 方法。

    另一种可能性是使用您知道包含在App_Code 文件夹中的某些已知类型来获取其程序集:

    var assembly = typeof(Some_Type_That_Is_Declared_In_App_Code).Assembly;
    var q = 
        from t in assembly.GetTypes()
        where t.IsClass && t.Namespace == "Sample"
        select t;
    

    【讨论】:

    • 感谢您的回复..但是如何从 Default.aspx.cs 文件中的示例命名空间中获取所有类名??
    • @ghanshyam.mirani,您可以使用AppDomain.CurrentDomain.GetAssemblies 获取项目中引用的所有程序集,然后为每个程序集执行您的代码以查找给定的类型。另一种可能性是使用 App_Code 中的一些已知类型来获取其程序集。
    猜你喜欢
    • 1970-01-01
    • 2012-07-21
    • 2011-01-13
    • 1970-01-01
    • 2015-01-26
    • 2020-10-20
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    相关资源
    最近更新 更多