首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 反射實作:取得類別的公開方法清單

     編輯:關於C語言

需求背景

在開發外掛系統、動態代理、API 文件產生器或測試框架時,常需要在執行時期檢視類別的公開方法。C# 的反射機制(System.Reflection)提供完整的型別中繼資料存取能力。

核心程式碼

using System;
using System.Reflection;

public string[] GetMethodList(Type type)
{
    // 取得宣告於此類別的公開實例方法(不含繼承)
    MethodInfo[] methods = type.GetMethods(
        BindingFlags.Public | 
        BindingFlags.Instance | 
        BindingFlags.DeclaredOnly);

    string[] names = new string[methods.Length];
    for (int i = 0; i < methods.Length; i++)
    {
        names[i] = methods[i].Name;
    }
    return names;
}

BindingFlags 參數說明

旗標用途
Public包含 public 方法
Instance包含實例方法(非 static)
DeclaredOnly僅包含直接宣告於此類別的成員,排除繼承自基底類別的成員
Static包含靜態方法
NonPublic包含 private/protected 方法
FlattenHierarchy包含繼承鏈上的靜態成員

常見變體

包含繼承的所有公開方法

MethodInfo[] allPublic = type.GetMethods(BindingFlags.Public | BindingFlags.Instance);

取得方法完整簽章

public string[] GetMethodSignatures(Type type)
{
    return type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
        .Select(m => $"{m.ReturnType.Name} {m.Name}({string.Join(", ", m.GetParameters().Select(p => $"{p.ParameterType.Name} {p.Name}"))})")
        .ToArray();
}

篩選特定屬性的方法

var apiMethods = type.GetMethods()
    .Where(m => m.GetCustomAttribute() != null)
    .ToArray();

效能考量

  • 反射操作較慢,建議 快取 MethodInfo[] 結果
  • 頻繁呼叫時,考慮使用 Delegate.CreateDelegate 或 Expression 樹建立強型別委派
  • .NET Core / .NET 5+ 可使用 System.Text.Json 原始碼產生器避免反射序列化

完整範例程式

using System;
using System.Reflection;

class Demo
{
    public void MethodA() { }
    public int MethodB(string s) => s.Length;
    private void InternalMethod() { }

    static void Main()
    {
        var list = GetMethodList(typeof(Demo));
        foreach (var name in list)
            Console.WriteLine(name);
        // 輸出:
        // MethodA
        // MethodB
    }

    static string[] GetMethodList(Type t) => 
        t.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
         .Select(m => m.Name)
         .ToArray();
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved