![](/img/trans.png)
[英]Is `GetReferencedAssemblies` a subset of `AppDomain.CurrentDomain.GetAssemblies()`?
[英]What has changed with AppDomain.CurrentDomain.GetAssemblies().SelectMany()?
在将我的项目从VS 2013迁移到VS 2015之后,我遇到了一些对象引用错误。
我将举例说明问题所在。
我有两个类,它们具有相同的名称StatusList
它们位于不同的命名空间下。
namespace TestNS.Interop.Cache.CacheItems
{
public class StatusList
{
public string Message { get; set; }
public StatusList()
{
Message = "I am a cache statuslist";
}
}
}
namespace TestNS.Interop.Enquiry
{
public class StatusList
{
public string Message { get; set; }
public StatusList()
{
Message = "I am an enquiry statuslist";
}
}
}
主程序调用AppDomain.CurrentDomain.GetAssemblies()
并查找第一个StatusList
。
var manyitems = AppDomain.CurrentDomain.GetAssemblies().SelectMany(o => o.GetTypes());
var typeServerCacheItem = manyitems.FirstOrDefault(o => o.Name == name);
class Program
{
static void Main(string[] args)
{
PrintMessagefromAssembly();
}
private static void PrintMessagefromAssembly()
{
const string name = "StatusList";
var manyitems = AppDomain.CurrentDomain.GetAssemblies().SelectMany(o => o.GetTypes());
var typeServerCacheItem = manyitems.FirstOrDefault(o => o.Name == name);
if (typeServerCacheItem == null)
{
Console.WriteLine("No item found");
return;
}
Console.WriteLine(typeServerCacheItem.FullName);
Console.ReadKey();
}
}
如果使用VS2013为此项目执行清理和构建,则返回的ServerCacheItem
类型是CacheItems
下的类。
如果使用VS 2015执行清理和构建,则返回的ServerCacheItem
类型是Enquiry
下的类。
我确实意识到代码应该是固定的,代码中存在逻辑错误CacheItem
的过滤条件应该存在。 但是我试图了解AppDomain.CurrentDomain.GetAssemblies()
工作方式发生了什么变化?
观看窗口VS 2015
观看窗口VS 2013
作为过滤器,您只需指定类型的ShortName : “ StatusList” ,还应指定名称空间,即FullName 。 FirstOrDefault()
不保证您将采用完全所需的类型而不是另一个类型。 在这种情况下,您不希望您得到完全想要的类型。
var typeServerCacheItem = manyitems
.FirstOrDefault(o => o.Name == name && o.Namespace == namespace);
关于VS2015的更改,是的,可能是发生了,但是它们不能保证您得到结果集的顺序,您应该自己承担
您已经对由GetTypes返回的对象的顺序进行了假设,但是MSDN文档中未定义此顺序。 这意味着不能保证第一项将始终相同。 您需要先对数组进行排序(例如,在名称空间上),然后才能获取第一项。
要回答这个问题,正确的方法是为缓存项过滤程序集。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.