有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]

Posted

技术标签:

【中文标题】有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]【英文标题】:Is there a way to go over all types in a namespace in a foreach loop? [duplicate] 【发布时间】:2010-11-11 07:34:49 【问题描述】:

我有一个接收类型并返回真或假的函数。 我需要找出某个命名空间中的所有类型,该函数将为它们返回 true。 谢谢。

【问题讨论】:

与 foreach 循环不严格相关,但类似的问题:***.com/questions/79693/… 您所说的“所有类型”是指anywhere 的所有类型,还是仅仅指给定程序集中的所有类型?因为如果你的意思是前者,你怎么知道我现在没有在我的机器上编写一个在你感兴趣的命名空间中有一个类型的程序集? 我的意思是所有在运行时可用的类型。 定义“可用”。假设我将我的程序集放在一个公共互联网站点上,但不告诉你。是可用的么”?您可以免费下载并在运行时使用它,但如果您不知道它的存在,则很难在您感兴趣的命名空间中搜索类型。 我问的原因是因为到目前为止所有的解决方案都只给出命名空间中的类型在给定的程序集中,这不是你问的问题。请记住,命名空间比程序集更大;您可以拥有一个位于一千个不同程序集中的命名空间。 【参考方案1】:

System.Reflection.Assembly.GetTypes():获取此程序集中定义的所有类型。*

应该做的工作=)

【讨论】:

【参考方案2】:

这是一个获取命名空间中所有类的函数:

using System.Reflection;
using System.Collections.Generic;

/// <summary>
/// Method to populate a list with all the class
/// in the namespace provided by the user
/// </summary>
/// <param name="nameSpace">The namespace the user wants searched</param>
/// <returns></returns>
static List<string> GetAllClasses(string nameSpace)

    //create an Assembly and use its GetExecutingAssembly Method
    //http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getexecutingassembly.aspx
    Assembly asm = Assembly.GetExecutingAssembly();
    //create a list for the namespaces
    List<string> namespaceList = new List<string>();
    //create a list that will hold all the classes
    //the suplied namespace is executing
    List<string> returnList = new List<string>();
    //loop through all the "Types" in the Assembly using
    //the GetType method:
    //http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.gettypes.aspx
    foreach (Type type in asm.GetTypes())
    
        if (type.Namespace == nameSpace)
            namespaceList.Add(type.Name);
    

    foreach (String className in namespaceList)
        returnList.Add(className);

    return returnList;

[更新]

这是一种更紧凑的方法,但这需要 .Net 3.5(来自 here):

public static IEnumerable<Type> GetTypesFromNamespace(Assembly assembly, 
                                               String desiredNamepace)

    return assembly.GetTypes()
                   .Where(type => type.Namespace == desiredNamespace);

【讨论】:

【参考方案3】:

添加所有要搜索的程序集并实现 MyFunction 方法:

class Program

    static void Main(string[] args)
    
        List<Assembly> assembliesToSearch = new List<Assembly>();
        // Add the assemblies that you want to search here:
        assembliesToSearch.Add(Assembly.Load("mscorlib")); // sample assembly, you might need Assembly.GetExecutingAssembly

        foreach (Assembly assembly in assembliesToSearch)
        
            var typesForThatTheFunctionReturnedTrue = assembly.GetTypes().Where(type => MyFunction(type) == true);

            foreach (Type type in typesForThatTheFunctionReturnedTrue)
            
                Console.WriteLine(type.Name);
            
        
    

    static bool MyFunction(Type t)
    
        // Put your logic here
        return true;
    

【讨论】:

以上是关于有没有办法在 foreach 循环中遍历命名空间中的所有类型? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 ForEach 循环的情况下遍历列表

js 循环遍历变量的几种方式

在 foreach 循环中使用 Intro.js 的 php 问题

C#中jobject 命名空间的啥

PHP中有没有办法在foreach中重新启动循环,或者在开关中更改测试值?

js 数组遍历时删除元素