亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用C#反射查找聲明函數的接口

使用C#反射查找聲明函數的接口

C#
一只名叫tom的貓 2021-05-06 14:16:31
我正在尋找一種簡單的方法來獲取有關方法的反射信息,該方法從類開始一直返回到聲明接口。這是簡化的代碼:public interface Ix{    void Function();}public class X : Ix{    public void Function() {}}public class Y : X{}類X的方法信息不包含有關在Ix接口中聲明Function的信息。這里是電話:var info = typeof(X).GetMethod("Function");var baseInfo = info.GetBaseDefinition()它返回以下數據:info.DeclaringType --> MyNamespace.Xinfo.ReflectedType --> MyNamespace.XbaseInfo.DeclaringType --> MyNamespace.XbaseInfo.ReflectedType --> MyNamespace.X對于類Y,返回相同的信息。我如何才能確定在接口Ix中聲明了此函數,而無需遍歷所有已實現的接口和類X或Y的基類?我可能會錯過一些簡單的東西,但我無法弄清楚是什么。這可能是錯誤嗎?這是.Net Core SDK版本2.1.104和Visual Studio 2017
查看完整描述

2 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

您似乎想要對可以從GetInterfaceMap獲得的信息進行反向查找。構建它非常簡單,


public static Dictionary<MethodInfo, List<(Type, MethodInfo)>> GetReverseInterfaceMap(Type t)

{

    var reverseMap = new Dictionary<MethodInfo, List<(Type, MethodInfo)>>();

    var maps = t.GetInterfaces().ToDictionary(i => i, i => t.GetInterfaceMap(i));

    foreach (var m in t.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))

    {

        var list = new List<(Type, MethodInfo)>();

        foreach (var (i, map) in maps)

        {

            for (int index = 0; index < map.TargetMethods.Length; index++)

            {

                var targetMethod = map.TargetMethods[index];

                if (targetMethod == m)

                {

                    list.Add((map.InterfaceType, map.InterfaceMethods[index]));

                    break;

                }

            }

        }


        reverseMap[m] = list;

    }


    return reverseMap;

}

關于界面的工作方式,有幾點要說明,因為畫面并不像“派生”->“基礎”->“界面”那樣簡單。有一個映射描述了每個接口方法調用的具體方法。該信息很容易獲得,因為運行時需要它來實現接口調度。然而,相反的過程并不那么簡單。一種具體方法可能是多個接口的映射。接口方法也可能被派生類重新映射。這一切都需要考慮在內。


查看完整回答
反對 回復 2021-05-21
  • 2 回答
  • 0 關注
  • 199 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號