簡體   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