我目前正在使用.NET(GIS库)的DotSpatial库。我在AppManager类中遇到错误。 AppManager是一个组件,用于管理扩展(包括数据提供程序)的加载,并有助于文件序列化:
代码被标记为foreach
public IEnumerable<string> GetDirectoriesNestedOneLevel()
{
// Visit each directory in Directories Property (usually set by application)
foreach (string directory in Directories.Union(new[] { "Data Extensions", "Tools" }))
{
string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, directory);
if (Directory.Exists(path))
{
yield return path;
// Add all of the directories in here, nested one level deep.
var dirs = Directory.EnumerateDirectories(path, "*", SearchOption.TopDirectoryOnly);
foreach (var dir in dirs)
{
yield return dir;
}
}
}
}
ParamName
第一
来源
System.Core程序
栈跟踪
在System.Linq.Enumerable.Union [TSource](IEnumerable
1 first, IEnumerable
1秒)at at DotSpatial.Controls.AppManager.d__9.MoveNext() 在c:\ dev \ DotSpatial \ DotSpatial.Controls \ Extensions \ AppManager.cs:line 581在DotSpatial.Controls.AppManager.GetCatalog()中 C:\ dev的\ DotSpatial \ DotSpatial.Controls \扩展\ AppManager.cs:行 563在DotSpatial.Controls.AppManager.LoadExtensions()中 C:\ dev的\ DotSpatial \ DotSpatial.Controls \扩展\ AppManager.cs:行 在C:\ Users \ Logan B中的DemoMap.MainForm..ctor()中的329。 Lehman \ Documents \ DemoMap \ DemoMap \ MainForm.cs:第230行 C:\ Users \ Logan B中的DemoMap.Program.Main()。 Lehman \ Documents \ DemoMap \ DemoMap \ Program.cs:第13行at System.AppDomain._nExecuteAssembly(RuntimeAssembly程序集,String [] args)在System.AppDomain.ExecuteAssembly(String assemblyFile, 证据assemblySecurity,String [] args)at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
在System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
在System.Threading.ExecutionContext.Run(ExecutionContext executionContext,ContextCallback回调,对象状态,布尔值 ignoreSyncCtx)at System.Threading.ExecutionContext.Run(执行上下文 executionContext,ContextCallback回调,对象状态)at System.Threading.ThreadHelper.ThreadStart()
对这里发生的事情有任何想法吗? * 非常感谢 *
答案 0 :(得分:2)
我的猜测是'目录'为空。从代码片段中不清楚应该的设置,但在这种情况下它没有被设置。由于Union的实现方式,错误有点神秘:它是一种扩展方法,所以在幕后实际调用是:
IEnumerableExtensions.Union(IEnumerable first, IEnumerable second)
根据目录的不同,在foreach之前会有一个快速修复:
if (Directories == null) { Directories = new List<string>().ToArray(); }
另一种可能性是:
var allDirs = new List<string>();
if (Directories != null) { allDirs.AddRange(Directories);}
allDirs.AddRange(new[]{ "Data Extensions", "Tools" });
foreach(string directory in allDirs)
但更好的解决方法是转到设置目录的代码并确保它始终设置一个值......
答案 1 :(得分:0)
Directories
属性为null,找出原因。
答案 2 :(得分:0)
用另外一行代码写这个,你计算目录列表,使代码更清晰,更好! 你确定你正确使用联盟吗?像AUnionB = A.Union(B)??在你的代码中不清楚。