在C#中获取命名空间中类的列表

15

我需要以编程方式获取给定命名空间中的所有类的List。我该如何在C#中实现这一点(反射?)?


当一个问题被标记为重复,而原始问题没有被引用时,这是多么令人烦恼啊。 - War
4个回答

39
var theList = Assembly.GetExecutingAssembly().GetTypes()
                      .Where(t => t.Namespace == "your.name.space")
                      .ToList();

总有那些“一行代码”的存在。;-) - Wim
1
是啊,你得喜欢一行代码的简洁 :-) - Klaus Byskov Pedersen
3
假设整个命名空间都在当前程序集中,这只是一个部分解决方案。 - War
1
战争,那么还有什么更好的解决方案呢? - Warren LaFrance

5

没有LINQ:

尝试:

Type[] types = Assembly.GetExecutingAssembly().GetTypes();
List<Type> myTypes = new List<Type>();
foreach (Type t in types)
{
  if (t.Namespace=="My.Fancy.Namespace")
    myTypes.Add(t);
}

Assembly.GetExecutingAssembly().GetTypes().ToList() 可以提供你所需要的列表。 - Gregory
是的 Greg,虽然严格来说这是使用了一个 LINQ 扩展方法,但我的示例旨在在没有 .NET 3.5 的情况下展示它。 - Wim
干净的非LINQ示例,尽管OP没有说程序集已经被加载,所以代码可能会返回一个空集合,即使列表应该很长,并且命名空间可能在更多的程序集中 :) - Rune FS
说得好,我应该只创建一个带有程序集参数的方法作为输入,并将客户端调用完全留给OP。;-) - Wim
相同的命名空间在多个程序集中并不是我设计的方式。对于基本命名空间来说还好,但我绝对不会让类型在同一个命名空间中分散到多个程序集中。那样很糟糕。 - Wim

2

1

我只能想到循环遍历程序集中的类型,以找到正确命名空间中的类型。

public List<Type> GetList()
        {
            List<Type> types = new List<Type>();
            var assembly = Assembly.GetExecutingAssembly();
            foreach (var type in assembly .GetTypes())
            {
                if (type.Namespace == "Namespace")
                {
                    types.Add(type);
                }
            }
            return types;
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接