首页 > 后端开发 > C++ > 如何使用反射来识别 C# 中的扩展方法?

如何使用反射来识别 C# 中的扩展方法?

Linda Hamilton
发布: 2025-01-06 08:57:40
原创
324 人浏览过

How Can Reflection Be Used to Identify Extension Methods in C#?

使用反射来识别扩展方法

在 C# 中,扩展方法提供了一种便捷的方法,可以在不修改原始类型的情况下向现有类型添加新功能类定义。确定扩展方法是否已添加到类中在各种场景中都很有用,例如单元测试或确保正确实现。

要使用反射识别扩展方法,必须首先查看扩展所在的程序集可以定义方法。识别用 ExtensionAttribute 属性修饰的类并检查这些类中的方法。任何用 ExtensionAttribute 标记且其第一个参数类型与您正在研究的类型匹配的方法都是扩展方法。

using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.Linq;
using System.Collections.Generic;

public static class FirstExtensions
{
    public static void Foo(this string x) { }
    public static void Bar(string x) { } // Not an ext. method
    public static void Baz(this int x) { } // Not on string
}

public static class SecondExtensions
{
    public static void Quux(this string x) { }
}

public class Test
{
    static void Main()
    {
        Assembly thisAssembly = typeof(Test).Assembly;
        foreach (MethodInfo method in GetExtensionMethods(thisAssembly, typeof(string)))
        {
            Console.WriteLine(method);
        }
    }

    static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
    {
        var isGenericTypeDefinition = extendedType.IsGenericType &amp;&amp; extendedType.IsTypeDefinition;
        var query = from type in assembly.GetTypes()
            where type.IsSealed &amp;&amp; !type.IsGenericType &amp;&amp; !type.IsNested
            from method in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
            where method.IsDefined(typeof(ExtensionAttribute), false)
            where isGenericTypeDefinition
                ? method.GetParameters()[0].ParameterType.IsGenericType &amp;&amp; method.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == extendedType
                : method.GetParameters()[0].ParameterType == extendedType
            select method;
        return query;
    }
}
登录后复制

在此示例中,GetExtensionMethods 标识 thisAssembly 程序集中字符串类型的所有扩展方法。它收集用 ExtensionAttribute 修饰的类型,并检查其方法是否有适当的参数类型和 ExtensionAttribute。

以上是如何使用反射来识别 C# 中的扩展方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板