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 });

若泛型参数是未定的,可采用如下方法:

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的泛型类了

第二种部份:泛型类型及参数均需要动态指定的情况

Type entityType = typeof(T);

Assembly assy = Assembly.GetExecutingAssembly();

//注意:以下字符串中的`1表示泛型参数占位符个数,一个泛型参数则表示为:`1,多个泛型参数则表示为:`N;

string genericTypeAssyName = string.Format("{0}.{1}Repository`1", assy.GetName().Name,entityType.Name);

var repositoryType = assy.GetType(repositoryAssyName, true, true);//获取泛型类型,不含泛型参数

var repositoryType = repositoryType.MakeGenericType(entityType); //获取泛型类型,并指定泛型参数

转:C# 通过反射来动态创建泛型类型 - jack_Meng - 博客园 (cnblogs.com)

相关:(47条消息) C#根据名称字符串创建对象(泛型类与泛型方法)_c#动态实例化对象_syzcyyx的博客-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lambda 表达式和反射可以很好地配合使用,可以通过反射动态调用方法,并将其与泛方法结合,实现更加灵活的编程。 以下是一个示例,演示如何使用 Lambda 表达式、反射和泛方法结合调用方法: ``` using System; using System.Linq.Expressions; using System.Reflection; class Program { static void Main(string[] args) { // 使用 Lambda 表达式创建一个 Func 委托 Func<int, int, int> addFunc = (x, y) => x + y; // 获取 addFunc 的 MethodInfo 对象 MethodInfo addMethodInfo = addFunc.Method; // 使用反射动态调用泛方法 MethodInfo genericMethodInfo = typeof(Program).GetMethod("CallGenericMethod"); MethodInfo callMethodInfo = genericMethodInfo.MakeGenericMethod(addMethodInfo.ReturnType); // 构建参数 object[] parameters = new object[] { addMethodInfo, 1, 2 }; // 调用泛方法 int result = (int)callMethodInfo.Invoke(null, parameters); Console.WriteLine("Result: " + result); } public static T CallGenericMethod<T>(MethodInfo method, object arg1, object arg2) { // 构建参数 object[] args = new object[] { arg1, arg2 }; // 调用方法 object result = method.Invoke(null, args); // 返回结果 return (T)result; } } ``` 在上面的示例中,我们首先创建了一个 Lambda 表达式,它是一个加法函数。然后,我们使用反射获取了该 Lambda 表达式对应的 MethodInfo 对象。接着,我们使用反射动态调用了泛方法 CallGenericMethod,该方法接受一个 MethodInfo 对象和两个参数,并返回一个与 MethodInfo 对象返回类相同的值。最后,我们通过反射调用了 CallGenericMethod 方法,并将参数传递给它。在 CallGenericMethod 方法内部,我们通过反射调用了传递的 MethodInfo 对象,实现了对 Lambda 表达式的调用,并返回了加法函数的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值