C# 反射泛型
2017-02-13 14:19
253 查看
C#泛型反射和普通反射的区别,泛型反射和普通反射的区别就是泛型参数的处理上
先看一个简单的例子。
class Class1<T>
{
public void Test(T t)
{
Console.WriteLine(t);
}
}
要利用反射动态创建该类型实例,并调用 Test 方法,我们可以使用如下方法
Type type = typeof(Class1<int>);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });
但如果泛型参数是未定的,我们该如何处理呢?其实 Type 已经增加了类似的处理机制。
static void InvokeTest(Type t, params object[] args)
{
Type type = typeof(Class1<>);
type = type.MakeGenericType(t);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
}
另外一种情况就是泛型方法,
class Class1
{
public void Test<T>(T t)
{
Console.WriteLine(t);
}
}
方法类似,只不过这回使用的是 MethodInfo.MakeGenericMethod()
static void InvokeTest(Type t, params object[] args)
{
Type type = typeof(Class1);
object o = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
method = method.MakeGenericMethod(t);
method.Invoke(o, args);
}
当然还有实例化一个泛型
例如有GenericType<M,N>
Type genericType = typeof(GenericType<>);
Type[] templateTypeSet = new[] { typeof(string), typeof(int) };
Type implementType = genericType.MakeGenericType( templateTypeSet );
这样 implementType类型就是赋予了string,int的泛型类了
C#泛型反射和普通反射的区别,泛型反射和普通反射的区别就是泛型参数的处理上
先看一个简单的例子。
class Class1<T>
{
public void Test(T t)
{
Console.WriteLine(t);
}
}
要利用反射动态创建该类型实例,并调用 Test 方法,我们可以使用如下方法
Type type = typeof(Class1<int>);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, new object[] { 123 });
但如果泛型参数是未定的,我们该如何处理呢?其实 Type 已经增加了类似的处理机制。
static void InvokeTest(Type t, params object[] args)
{
Type type = typeof(Class1<>);
type = type.MakeGenericType(t);
object o = Activator.CreateInstance(type);
type.InvokeMember("Test", BindingFlags.Default | BindingFlags.InvokeMethod, null, o, args);
}
另外一种情况就是泛型方法,
class Class1
{
public void Test<T>(T t)
{
Console.WriteLine(t);
}
}
方法类似,只不过这回使用的是 MethodInfo.MakeGenericMethod()
static void InvokeTest(Type t, params object[] args)
{
Type type = typeof(Class1);
object o = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("Test", BindingFlags.Instance | BindingFlags.Public);
method = method.MakeGenericMethod(t);
method.Invoke(o, args);
}
当然还有实例化一个泛型
例如有GenericType<M,N>
Type genericType = typeof(GenericType<>);
Type[] templateTypeSet = new[] { typeof(string), typeof(int) };
Type implementType = genericType.MakeGenericType( templateTypeSet );
这样 implementType类型就是赋予了string,int的泛型类了
相关文章推荐
- 【整理】C#2.0泛型编程之泛型方法、泛型委托、泛型的属性与反射
- C#中反射泛型
- c#反射泛型方法
- C# 使用反射动态调用泛型方法
- 解决C#中dynamic类型作为泛型参数的反射问题
- C#中的委托和事件 C# 泛型简介 .Net 中的反射 .NET 元数据概述
- C# ORM 泛型与反射的交叉应用 - 更新表中除了主键的所有数据
- C# 反射调用带参数的重载的泛型方法
- C#中反射泛型 CreateInstance
- C#中利用LINQ to XML与反射把任意类型的泛型集合转换成XML格式字符串的方法
- C# 泛型方法中反射常用方法浅析
- c# 泛型+反射
- C#综合揭秘——利用泛型与反射更新实体(ADO.NET Entity Framework)
- c#简易反射调用泛型方法
- C#通过反射调用泛型方法
- C#反射静态方法开发实例详解(从DataReader将数据填充到数据实体泛型集合)
- C#综合揭秘——利用泛型与反射更新实体(ADO.NET Entity Framework)
- 【C# 反射泛型】
- 使用C#反射中的MakeGenericType函数,来为泛型方法和泛型类指定(泛型的)类型
- C# 泛型方法反射调用窗体