【问题标题】:Get list of classes in namespace in C# [duplicate]在C#中获取命名空间中的类列表[重复]
【发布时间】:2010-12-22 13:58:19
【问题描述】:

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

【问题讨论】:

  • 当一个问题被标记为重复并且没有引用原始问题时,这是多么令人讨厌。

标签: c# .net reflection


【解决方案1】:
var theList = Assembly.GetExecutingAssembly().GetTypes()
                      .Where(t => t.Namespace == "your.name.space")
                      .ToList();

【讨论】:

  • 总是有“单行”。 ;-)
  • 是的,你一定会喜欢单线的 :-)
  • 这假定整个命名空间都在当前程序集中,充其量是部分解决方案。
  • 战争,那么有什么更好的解决方案?
【解决方案2】:

看看这个How to get all classes within namespace?提供的答案返回一个Type[]数组,你可以轻松修改它以返回List

【讨论】:

    【解决方案3】:

    没有 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() 会给你你想要的列表。
    • 是的,格雷格,虽然从技术上讲,那是使用 LINQ 扩展方法,而我的示例旨在在没有 .NET 3.5 的情况下展示这一点
    • clean non linq example 虽然 OP 没有说程序集已经加载,所以代码可能返回一个空集,即使列表应该很长并且名称空间可能在更多程序集中: )
    • 公平点,我应该刚刚创建了一个带有 Assembly 参数作为输入的方法,并将客户端调用完全留给 OP。 ;-)
    • 更多程序集中的相同命名空间不是我的设计方式。对于基本命名空间来说很好,但我绝对不会将同一命名空间中的类型分布在多个程序集中。太恶心了。
    【解决方案4】:

    我只能想到遍历组件中的类型以在正确的命名空间中找到它们

    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;
            }
    

    【讨论】:

      猜你喜欢
      • 2017-07-13
      • 2020-12-18
      • 2010-12-08
      • 2011-03-22
      • 2016-07-26
      • 1970-01-01
      • 2014-05-10
      • 2011-08-24
      • 2014-08-26
      相关资源
      最近更新 更多