首页 > 后端开发 > C++ > 如何在 C# 中使用运行时确定的类型参数动态调用泛型方法?

如何在 C# 中使用运行时确定的类型参数动态调用泛型方法?

Barbara Streisand
发布: 2024-12-30 19:09:13
原创
618 人浏览过

How Can I Dynamically Invoke Generic Methods with Runtime-Determined Type Arguments in C#?

使用动态类型参数调用泛型方法

问题

在您的场景中,您想要迭代特定命名空间中的接口集合,并且动态地调用每个接口的通用方法。但是,由于编译时的类型参数未知,您会遇到编译时错误。

解决方案

要动态调用具有运行时已知类型参数的泛型方法,可以使用反射,如下所示:

  1. 获取泛型方法信息:使用Type.GetMethod方法检索泛型方法定义。
  2. 生成泛型方法实例:在泛型方法定义上调用 MakeGenericMethod 方法来生成所需类型参数的特定方法实例。
  3. 调用泛型方法实例:使用Invoke方法调用生成的泛型方法实例,并带有所需的内容

示例代码

using System;
using System.Linq;
using System.Reflection;

public class TestClass
{
    public static void CallGeneric<T>()
    {
        Console.WriteLine($"Generic type: {typeof(T)}");
    }

    public static void Main()
    {
        var assembly = Assembly.GetExecutingAssembly();

        var interfaces = assembly.GetTypes()
            .Where(t => t.Namespace == "MyNamespace.Interfaces");

        var genericMethod = typeof(TestClass).GetMethod("CallGeneric");

        foreach (var interfaceType in interfaces)
        {
            var genericMethodInstance = genericMethod.MakeGenericMethod(interfaceType);
            genericMethodInstance.Invoke(null, null); // No target or arguments needed
        }
    }
}
登录后复制

在此示例中:

  • CallGeneric 方法被定义为打印泛型类型参数的泛型方法.
  • 我们从继承自的特定命名空间中获取所有类型MyNamespace.Interfaces。
  • 我们使用反射来获取泛型方法 CallGeneric 并为每个接口类型创建一个泛型方法实例。
  • 我们调用泛型方法实例时不需要任何目标或参数,因为它是一个不带任何参数的静态方法。

以上是如何在 C# 中使用运行时确定的类型参数动态调用泛型方法?的详细内容。更多信息请关注PHP中文网其他相关文章!

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