繁体   English   中英

AppDomain.CurrentDomain.GetAssemblies()。SelectMany()发生了什么变化?

[英]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 2015

断点和顺序VS 2013

观看窗口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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM