比较命名空间以查看它们是否匹配

时间:2014-08-01 08:40:54

标签: c# namespaces

我正在尝试比较命名空间,看看我的方法是否只抛出正确的异常。除了正确的例外,我的意思是:

  1. 来自同一名称空间的异常。
  2. 更高名称空间的异常。
  3. 等效(和更高)系统命名空间的例外。
  4. 示例:

    1. 方法位于命名空间MyNamespace.Collections.Generic中,因此可以从MyNamespace.Collections.Generic中抛出异常。
    2. 方法位于命名空间MyNamespace.Collections.Generic中,因此可以从MyNamespace.CollectionsMyNamespace中抛出异常。
    3. 方法位于命名空间MyNamespace.Collections.Generic中,因此可以从System.Collections.GenericSystem.Collections以及System中抛出异常。
    4. 第一部分很容易;检查相同的命名空间。 3号工作的一部分工作;因为System命名空间总是正确的。

      对于其他部分,我尝试了以下内容:

      string[] exceptNamespaceSegments = exceptionNamespaceSegments
                                         .Except(classNamespaceSegments)
                                         .ToArray();
      
      if (exceptNamespaceSegments.Length == 1 && exceptNamespaceSegments.FirstOrDefault() == "System")
          return;
      

      其中检查命名空间段(Collections,Generic)是否也在类命名空间中使用。如果是这种情况,则抛出正确的异常。

      但是,如果异常位于命名空间System.Collections.Generic.Something中,这不会起作用,因为Something不在类命名空间中。

      想一想,这并没有考虑到序列。所以System.Generic.Collections也是正确的;使用我现在拥有的东西。

      有没有办法可以完成这项工作而无需编写比较每个细分的if语句?

1 个答案:

答案 0 :(得分:0)

除非我误解了这个问题:你可以尝试这样的东西,根据给定的标准找到所有允许的命名空间。

private static IEnumerable<string> GetAllowedNamespaces(Type type)
{
    const string System = "System";
    string thisNamespace = type.Namespace;
    HashSet<string> hashset = new HashSet<string>();
    hashset.Add(thisNamespace);
    hashset.Add(System);
    var parts = thisNamespace.Split('.');
    if (parts.Length > 1)
    {
        string previous = string.Empty;
        foreach (var part in parts)
        {
            var current = string.IsNullOrEmpty(previous)
                ? part
                : string.Format("{0}.{1}", previous, part);
            previous = current;
            hashset.Add(current);
        }

        previous = string.Empty;
        foreach (var part in new[] { System  }.Concat(parts.Skip(1)))
        {
            var current = string.IsNullOrEmpty(previous)
                ? part
                : string.Format("{0}.{1}", previous, part);
            previous = current;
            hashset.Add(current);
        }
    }

    return hashset;
}

然后,您可以轻松检查异常的命名空间是否属于此列表,如果不存在问题:)

存在重复的代码块,您可以将其重构为遵循DRY原则的方法。