第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取實現(xiàn)給定接口的所有已加載類型的所有實例?

如何獲取實現(xiàn)給定接口的所有已加載類型的所有實例?

C#
慕田峪9158850 2019-12-04 12:48:48
我們需要獲取實現(xiàn)給定接口的對象的所有實例-我們可以這樣做,如果可以的話如何?
查看完整描述

3 回答

?
喵喵時光機

TA貢獻1846條經(jīng)驗 獲得超7個贊

我不相信有辦法...您將要么能夠遍歷Heap,并檢查那里的每個對象,要么遍歷應用程序進程空間中每個活動線程的堆棧,檢查上的每個堆棧引用變量。每個線程...

另一種方法是,(我想你做不到)是攔截所有對象創(chuàng)建活動(使用容器方法)并保留應用程序中所有對象的列表...


查看完整回答
反對 回復 2019-12-04
?
慕無忌1623718

TA貢獻1744條經(jīng)驗 獲得超4個贊

如果您需要實現(xiàn)特定接口的所有類型的實例(樣本),則可以遍歷所有類型,檢查接口并在找到匹配項的情況下創(chuàng)建實例。


這是一些偽代碼,看起來非常像C#,甚至可以編譯并返回您需要的偽代碼。如果沒有其他問題,它將為您指明正確的方向:


public static IEnumerable<T> GetInstancesOfImplementingTypes<T>()

{

    AppDomain app = AppDomain.CurrentDomain;

    Assembly[] ass = app.GetAssemblies();

    Type[] types;

    Type targetType = typeof(T);


    foreach (Assembly a in ass)

    {

        types = a.GetTypes();

        foreach (Type t in types)

        {

            if (t.IsInterface) continue;

            if (t.IsAbstract) continue;

            foreach (Type iface in t.GetInterfaces())

            {

                if (!iface.Equals(targetType)) continue;

                yield return (T) Activator.CreateInstance(t);

                break;

            }

        }

    }

}

現(xiàn)在,如果您正在談論遍歷堆并返回實現(xiàn)特定類型的所有對象的先前實例化的實例,那么祝您好運,因為此信息不是由.Net運行時存儲的(可以由調(diào)試器/分析器通過檢查堆來計算) / stack這樣)。


根據(jù)您認為需要這樣做的原因,可能有更好的解決方法。


查看完整回答
反對 回復 2019-12-04
?
繁星點點滴滴

TA貢獻1803條經(jīng)驗 獲得超3個贊

對象的所有實例還是所有類型?

獲取對象的所有實例幾乎是不可能的,并且將涉及有關通過管理內(nèi)存進行掃描的非公開信息。

在給定的域內(nèi),獲取實現(xiàn)給定接口的所有類型都是可行的。(即,您可以找到在程序集中定義的實現(xiàn)特定接口的所有類型)

  • 加載程序集

  • 遍歷其類型(調(diào)用asm.GetTypes())

  • 檢查typeof(IMyInterface).IsAssignibleFrom(testType)


查看完整回答
反對 回復 2019-12-04
  • 3 回答
  • 0 關注
  • 730 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號