C# 通过放射获取扩展方法

注意,扩展方法本质上是静态方法,所以拿到MethodInfo时,应该这么调用 methodInfo.Invoke(null, new object[]{params})

 1 static IEnumerable<MethodInfo> GetExtensionMethods(Assembly assembly, Type extendedType)
 2         {
 3             var query = from type in assembly.GetTypes()
 4                         where !type.IsGenericType && !type.IsNested
 5                         from method in type.GetMethods(BindingFlags.Static
 6                             | BindingFlags.Public | BindingFlags.NonPublic)
 7                         where method.IsDefined(typeof(System.Runtime.CompilerServices.ExtensionAttribute), false)
 8                         where method.GetParameters()[0].ParameterType == extendedType
 9                         select method;
10             return query;
11         }
时间: 2024-10-10 09:50:54

C# 通过放射获取扩展方法的相关文章

C#枚举扩展方法,获取枚举值的描述值以及获取一个枚举类下面所有的元素

/// <summary> /// 枚举扩展方法 /// </summary> public static class EnumExtension { private static Dictionary<string, Dictionary<string, string>> _enumCache; /// <summary> /// 缓存 /// </summary> private static Dictionary<stri

C#.NET为List添加扩展方法:获取唯一值

public static class ListTools { /// <summary> /// 获取唯一值列表 /// </summary> /// <param name="strList">原始值</param> /// <returns>唯一值</returns> public static List<T> GetUniqueValue<T>(this List<T>

枚举扩展方法获取枚举Description

枚举扩展方法 1 /// <summary> 2 /// 扩展方法,获得枚举的Description 3 /// </summary> 4 /// <param name="value">枚举值</param> 5 /// <param name="nameInstend">当枚举没有定义DescriptionAttribute,是否用枚举名代替,默认使用</param> 6 /// <r

Linq扩展方法获取单个元素

在使用Linq 提供的扩展方法时,First(OrDefault), Single(OrDefault), Last(OrDefault)都具有返回单个元素的功能.MSDN对这些方法的描述只有功能说明,没有关于内部的相关实现的描述说明. 首先我们来看下MSDN上关于这些扩展方法的官方描述: First: 返回序列中的第一个元素 . FirstOrDefault: 返回序列中的第一个元素:如果未找到元素,则返回默认值. Last:返回序列的最后一个元素. LastOrDefault: 返回序列中的

c# 扩展方法奇思妙用基础篇五:Dictionary&lt;TKey, TValue&gt; 扩展

Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary<TKey, TValue>不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException. 大多时候,我们都会写成以下的样子: var dict = new Dictionary<int, string>()

C# 获取当前路径方法(转)

C# 获取当前路径方法 //获取包含清单的已加载文件的路径或 UNC 位置. public static string sApplicationPath = Assembly.GetExecutingAssembly ( ).Location; //result: X:\xxx\xxx\xxx.dll (.dll文件所在的目录+.dll文件名) //获取当前进程的完整路径,包含文件名(进程名). string str = this.GetType ( ).Assembly.Location; /

C#的扩展方法解析

在使用面向对象的语言进行项目开发的过程中,较多的会使用到"继承"的特性,但是并非所有的场景都适合使用"继承"特性,在设计模式的一些基本原则中也有较多的提到. 继承的有关特性的使用所带来的问题:对象的继承关系实在编译时就定义好了,所以无法在运行时改变从父类继承的实现.子类的实现与它父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化.当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写它或被其他更适合的类替换,这种依赖关系限制

c# 之DataTable的扩展方法

由于太懒了,很久没更新了.毕业了,得好好装逼学习了,不能一心想着完了. 由于公司中的项目大量的使用DataTable,而每次对datatable进行操作的时候需要写很多相同的代码,所以秉着 装逼而学习 的态度,于是撸了几个扩展方法,记录下来,学习下.     class Program     {         public DataTable LinqTable = new DataTable();         void AddNewRow(int id, string name)   

Entity Framework DbSet&lt;T&gt;之Include方法与IQueryable&lt;T&gt;扩展方法Include的使用

Entity Framework使用Code First方式时,实体之间已经配置好关系,根据实际情况某些情况下需要同时获取导航属性,比如获取商品的同时需要获取分类属性(导航属性),或者基于优化方面考虑等,下面来看一个例子 例子中有会员实体类(Member)与角色实体类(Role),Role与Member的关系是1:n,控制台应用程序代码如下: using System; using System.Collections.Generic; using System.Linq; using Syst