AppDomain.CurrentDomain.GetAssemblies()改变了什么.SelectMany()?

时间:2016-04-28 11:23:37

标签: c# .net reflection visual-studio-2015

将我的项目从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()的工作方式发生了哪些变化?

Breakpoint and Order VS 2015

观看窗口VS 2015

Break point and Order VS 2013

观看窗口VS 2013

3 个答案:

答案 0 :(得分:1)

作为过滤器,您只需指定类型的 ShortName “StatusList”,还应指定名称空间,即 FullName FirstOrDefault()并不能保证您将采用与其他类型完全相同的类型。在这种情况下,你一定不希望得到完全想要的类型。

    var typeServerCacheItem = manyitems
.FirstOrDefault(o => o.Name == name && o.Namespace == namespace);

关于VS2015的变化,是的,可能是他们发生了,但是他们不能保证你对结果集的顺序,你应该自己承担

答案 1 :(得分:1)

您已对GetTypes返回的对象的排序做出了假设,但这未在MSDN文档中定义。这意味着无法保证第一个项目始终相同。在获取第一个项目之前,您需要首先对数组进行排序(例如,在命名空间上)。

答案 2 :(得分:0)

要回答这个问题,正确的方法是过滤缓存项目的程序集。