news 2026/6/10 16:49:22

C#中记录一下使用字符串文本调用泛型方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C#中记录一下使用字符串文本调用泛型方法

C#是静态类型语言,泛型参数在编译时必须确定,不能直接使用一个字符串来指定泛型参数,可以通过反射或者缓存打开窗口的委托来调用泛型方法。​​​​​​​​​​​​​​​​​​​​​​​​​​​​

准备:

准备几个测试供后续使用,代码如下:

public class Animal { public virtual void Print() { } } public class Dog : Animal { public override void Print() { Debug.Log("这是一只狗"); } } public class Duck : Animal { public override void Print() { Debug.Log("这是一只鸭子"); } } public class Test : MonoBehaviour { void Start() { } public void SummonAnimal<T>() where T : Animal,new() { T animal = new T(); animal.Print(); } }

方案一:

代码如下:

public void CallAnimalByName(string animalClassName) { // 获取程序集中的类型 var type = Assembly.GetExecutingAssembly() .GetTypes() .FirstOrDefault(t => t.Name == animalClassName && t.IsSubclassOf(typeof(Animal))); if (type != null) { // 通过反射调用泛型方法 var method = typeof(Test).GetMethod("SummonAnimal"); var genericMethod = method.MakeGenericMethod(type); genericMethod.Invoke(this, null); } }

在Test的Start方法中调用

void Start() { CallAnimalByName("Dog"); }

结果:

方案二:

代码如下:

private Dictionary<string, Action> animalActions = new Dictionary<string, Action>(); // 注册窗口类型 public void RegisterWindow<T>() where T : Animal, new() { string animalName = typeof(T).Name; animalActions[animalName] = () => SummonAnimal<T>(); } // 通过配置调用 public void CallAnimalByName2(string animalName) { if (animalActions.TryGetValue(animalName, out Action action)) { action(); } }

在Test的Start方法中调用:

void Start() { RegisterWindow<Duck>(); CallAnimalByName2("Duck"); }

结果:​​​​​​​

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 3:01:12

Vita3K终极安装指南:轻松玩转PS Vita游戏

Vita3K终极安装指南&#xff1a;轻松玩转PS Vita游戏 【免费下载链接】Vita3K Experimental PlayStation Vita emulator 项目地址: https://gitcode.com/gh_mirrors/vi/Vita3K Vita3K是一款免费开源的PlayStation Vita模拟器&#xff0c;让你能够在PC上体验PS Vita游戏的…

作者头像 李华
网站建设 2026/6/10 1:58:08

26护士资格证报名照要求 制作+审核流程

宝子们&#xff01;26护士资格考试报名已经开始啦&#xff0c;最容易卡壳的就是照片上传这一步&#xff0c;学姐我整理了超详细的照片要求上传流程&#xff0c;手把手教你搞定&#x1f4aa;&#x1f4f7; 照片硬性要求 ▫️尺寸&#xff1a;295413px&#xff08;1寸彩色标准证件…

作者头像 李华
网站建设 2026/6/10 15:17:45

Window环境下使用Jenkins搭建Android自动打包

下载Jenkins 官网下载:Jenkins download and deployment LTS 版本是长期支持版本,主要针对生产环境使用。它提供了长期稳定的技术支持,保证软件稳定性和安全性。在 LTS 版本中,重要的问题得到了修复,并且可以更好地保证兼容性。 普通版本是每两周发布一次的版本,不提供…

作者头像 李华
网站建设 2026/6/10 16:48:54

5大iTerm2主题美化技巧:从入门到精通的终端个性化指南

5大iTerm2主题美化技巧&#xff1a;从入门到精通的终端个性化指南 【免费下载链接】iTerm2 iTerm2 is a terminal emulator for Mac OS X that does amazing things. 项目地址: https://gitcode.com/gh_mirrors/it/iTerm2 iTerm2作为Mac系统上功能最强大的终端模拟器&am…

作者头像 李华
网站建设 2026/6/10 11:49:24

模型对接失败?Dify私有化适配避坑指南,90%的人都忽略了这3点

第一章&#xff1a;模型对接失败&#xff1f;Dify私有化适配避坑指南的核心问题在部署 Dify 实现大模型私有化集成时&#xff0c;常因环境配置与接口协议不匹配导致模型对接失败。最常见的问题集中在网络隔离、认证机制和模型服务暴露方式三个方面。网络策略配置不当 私有化部署…

作者头像 李华
网站建设 2026/6/10 13:30:02

Symfony 8微服务架构适配全解析(服务拆分与通信机制深度揭秘)

第一章&#xff1a;Symfony 8微服务架构演进与核心理念Symfony 8标志着PHP企业级开发在微服务领域的又一次重要跃迁。该版本在保持传统MVC结构灵活性的同时&#xff0c;深度整合了领域驱动设计&#xff08;DDD&#xff09;与容器化部署的最佳实践&#xff0c;使开发者能够更高效…

作者头像 李华