我正在尝试比较命名空间,看看我的方法是否只抛出正确的异常。除了正确的例外,我的意思是:
示例:
MyNamespace.Collections.Generic
中,因此可以从MyNamespace.Collections.Generic
中抛出异常。MyNamespace.Collections.Generic
中,因此可以从MyNamespace.Collections
和MyNamespace
中抛出异常。MyNamespace.Collections.Generic
中,因此可以从System.Collections.Generic
和System.Collections
以及System
中抛出异常。第一部分很容易;检查相同的命名空间。 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语句?
答案 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原则的方法。