首页 > 后端开发 > C++ > 如何调用具有运行时确定类型的泛型方法?

如何调用具有运行时确定类型的泛型方法?

Linda Hamilton
发布: 2024-12-30 14:53:16
原创
1005 人浏览过

How Can I Call Generic Methods with Runtime-Determined Types?

调用运行时确定类型的泛型方法

尝试调用编译时类型参数未知的泛型方法时会出现此问题。普通方法调用依赖于编译器执行的类型安全检查,但是当类型仅在运行时可用时,需要替代方法。

基于反射的解决方案

在提供的代码示例的上下文中:

public void Method<T>() where T : class {}
public void AnotherMethod()
{
    ...
    foreach (var interface in interfaces)
    {
        Method<interface>(); // Compile error!
    }
}
登录后复制

绕过编译时类型检查:

  1. 使用 Type.GetMethod 检索开放泛型方法

    MethodInfo method = typeof(Test).GetMethod("Method");
    登录后复制
  2. 使方法泛型与MakeGenericMethod:

    MethodInfo genericMethod = method.MakeGenericMethod(interface);
    登录后复制
  3. 使用 Invoke 调用方法

    :
    genericMethod.Invoke(null, null); // No target or arguments in this case
    登录后复制

完全的示例

为了阐明该过程,请考虑此修订后的代码示例:
using System;
using System.Linq;
using System.Reflection;

namespace Sample
{
    interface IFoo { }
    interface IBar { }

    class Program
    {
        public static void CallMe<T>()
        {
            Console.WriteLine("Type of T: {0}", typeof(T));
        }

        static void Main()
        {
            var types = typeof(Program).Assembly.GetTypes().Where(t => t.Namespace == "Sample");

            var methodInfo = typeof(Program).GetMethod("CallMe");

            foreach (var type in types)
            {
                var genericMethodInfo = methodInfo.MakeGenericMethod(type);
                genericMethodInfo.Invoke(null, null);
            }
        }
    }
}
登录后复制

在此示例中,根据 Sample 命名空间中找到的类型动态调用通用 CallMe 方法.

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

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