将我的项目从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
答案 0 :(得分:1)
作为过滤器,您只需指定类型的 ShortName :“StatusList”,还应指定名称空间,即 FullName 。 FirstOrDefault()
并不能保证您将采用与其他类型完全相同的类型。在这种情况下,你一定不希望得到完全想要的类型。
var typeServerCacheItem = manyitems
.FirstOrDefault(o => o.Name == name && o.Namespace == namespace);
关于VS2015的变化,是的,可能是他们发生了,但是他们不能保证你对结果集的顺序,你应该自己承担
答案 1 :(得分:1)
您已对GetTypes返回的对象的排序做出了假设,但这未在MSDN文档中定义。这意味着无法保证第一个项目始终相同。在获取第一个项目之前,您需要首先对数组进行排序(例如,在命名空间上)。
答案 2 :(得分:0)
要回答这个问题,正确的方法是过滤缓存项目的程序集。