以非泛型方式调用泛型方法
2007-02-28 23:35
316 查看
通过泛型方法定义具有特定类型意义的方法是常用的手段。但在某些特定情况下,例如在一些通用的框架中,直到运行时才能确定泛型类型参数,就必须通过非泛型方式来调用泛型方法。
假定有这样一个方法:
public static void Add<T>(T obj, IList<T> list)
如果想换成这样调用:
Add(Type type, object obj, object list);
通常的方法是这样的:
void Add(Type type, object obj, object list)
public delegate void GM<T>(T obj, IList<T> list);
然后再定义一个非泛型包装的接口:
interface ING
public class GClass<T> : ING
static ING GetNGC(Type genericType, Type methodType, string methodName)
通过执行所返回接口的非泛型方法来达到调用泛型方法的目的:
ING ng = GetNGC(typeof(int), typeof(MyType), "Add");
ng.NGM(i, list);
比对一下,耗时大约是直接泛型调用耗时的三倍。显然这个方案是一个非常实用的方案。归纳一下,一共需要四步:
定义泛型委托;
定义非泛型接口;
实现这个接口;
通过泛型委托获取非泛型接口的实现。
其中前两步比较简单,后两部稍嫌麻烦。于是,我们再进一步实现一个通用的接口实现及其输出。
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
namespace GenericMethodTest
结论:
以下是测试代码:
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace GenericMethodTest
测试结果:
假定有这样一个方法:
public static void Add<T>(T obj, IList<T> list)
如果想换成这样调用:
Add(Type type, object obj, object list);
通常的方法是这样的:
void Add(Type type, object obj, object list)
public delegate void GM<T>(T obj, IList<T> list);
然后再定义一个非泛型包装的接口:
interface ING
public class GClass<T> : ING
static ING GetNGC(Type genericType, Type methodType, string methodName)
通过执行所返回接口的非泛型方法来达到调用泛型方法的目的:
ING ng = GetNGC(typeof(int), typeof(MyType), "Add");
ng.NGM(i, list);
比对一下,耗时大约是直接泛型调用耗时的三倍。显然这个方案是一个非常实用的方案。归纳一下,一共需要四步:
定义泛型委托;
定义非泛型接口;
实现这个接口;
通过泛型委托获取非泛型接口的实现。
其中前两步比较简单,后两部稍嫌麻烦。于是,我们再进一步实现一个通用的接口实现及其输出。
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Reflection.Emit;
using System.Text;
namespace GenericMethodTest
结论:
以下是测试代码:
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
namespace GenericMethodTest
测试结果:
方案 | 耗时 | 比对 | 其他优点 |
直接调用 | 18 | 1 | 不通用 |
泛型委托包装 | 43 | 2.39 | 不通用 |
反射 | 16538 | 918.78 | 通用,不需额外定义 |
非泛型接口包装 | 60 | 3.33 | 通用,需要额外定义并实现 |
动态生成的非泛型接口包装 | 72 | 4 | 通用,需要额外定义 |
相关文章推荐
- 以非泛型方式调用泛型方法
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法(一) 推荐
- 对《以非泛型方式调用泛型方法》一文的探讨
- 以非泛型方式调用泛型方法 (二)
- 对《以非泛型方式调用泛型方法》一文的探讨
- 以非泛型方式调用泛型方法
- 以非泛型方式调用泛型方法(三)
- 改进的“以非泛型方式调用泛型方法”之基于DynamicMethod的实现
- SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)
- C# 泛型方法反射调用窗体
- 调用对方WSDL中方法,使用CALL方式传递字符串参数
- unity中跨脚本调用方法的3种方式
- .NET CORE动态调用泛型方法详解
- JAVA高级【10.2】《Java核心技术2》本地方法-几种java调用dll的方式