📜  获取扩展类 c# 的所有类(1)

📅  最后修改于: 2023-12-03 15:11:52.144000             🧑  作者: Mango

获取扩展类 c# 的所有类

在 C# 中,扩展方法和扩展属性可以为现有的类添加新的方法和属性。在某些情况下,我们需要获取一个类中所有的扩展方法和扩展属性,以便于进一步的使用。本文将介绍如何获取扩展类 C# 的所有类。

获取扩展类的方法

首先,我们需要创建一个静态类来扩展我们想要获取信息的类。下面是一个示例:

// 扩展方法示例
public static class MyExtensions
{
    public static void Print(this string s)
    {
        Console.WriteLine(s);
    }
}

// 扩展属性示例
public static class MyExtensions
{
    public static int Count(this string s)
    {
        return s.Length;
    }
}

在上面的代码中,我们创建了两个静态类,分别用来扩展 string 类型。我们为 string 类型添加了 Print() 方法和 Count 属性。

现在,我们来看看如何获取 string 类型中的所有扩展方法和扩展属性。我们可以使用反射来完成这个任务。

static void Main(string[] args)
{
    Assembly myAssembly = Assembly.GetExecutingAssembly(); // 获取当前执行程序的程序集

    Type[] types = myAssembly.GetTypes(); // 获取程序集中的所有类型

    foreach (Type type in types)
    {
        var methods = type.GetMethods(BindingFlags.Static | BindingFlags.Public) // 获取所有公共静态方法
            .Where(m => m.GetCustomAttributes(typeof(ExtensionAttribute), false).Any()) // 只获取带有 ExtensionAttribute 特性的方法
            .Select(m => m.Name); //仅仅获取方法名称
        if (methods.Any())
        {
            Console.WriteLine($"Type \"{type.Name}\" has extension methods: {string.Join(", ", methods)}");
        }

        var properties = type.GetProperties(BindingFlags.Static | BindingFlags.Public) // 获取所有公共静态属性
            .Where(p => p.GetCustomAttributes(typeof(ExtensionAttribute), false).Any()) // 只获取带有 ExtensionAttribute 特性的属性
            .Select(p => p.Name); // 仅仅获取属性名称
        if (properties.Any())
        {
            Console.WriteLine($"Type \"{type.Name}\" has extension properties: {string.Join(", ", properties)}");
        }
    }
}

在上面的代码中,我们首先获取了当前执行程序的程序集。然后,我们获取了程序集中的所有类型,并遍历每一个类型。对于每一个类型,我们使用反射获取所有的公共静态方法和属性,然后判断是否有 ExtensionAttribute 特性。如果有,我们就输出它们的名称。

结论

使用反射可以轻松地获取扩展类 C# 中的所有扩展方法和扩展属性。本文介绍了如何使用反射来获取这些信息,并提供了完整的代码示例。希望这篇文章能够帮助您了解如何获取扩展类 C# 中的所有类。