当前位置: 首页 > news >正文

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

结果:​​​​​​​

http://www.cnnetsun.cn/news/9608.html

相关文章:

  • V型翅片与六边形蜂窝翅片的散热性能差异
  • 以太网温湿度传感器五重告警方式如何协同工作?
  • COMSOL介电金属多层膜结构宽谱吸收器:文献复现与吸收特性研究
  • 【必看收藏】LangChain生态实战:LangGraph+LangSmith构建可追踪AI智能体全流程解析
  • 使用DeepSeek开发第一个RAG
  • Jetson Secure Boot 完整实战指南:从 Fuse Key → Boot Chain → 验签代码路径的源码级解析
  • 【LeetCode30_滑动窗口 + 哈希表】:三招搞定“串联所有单词的子串”
  • 以全栈AI能力重塑智能客服服务效能
  • 如何在PHP项目中嵌入Rust代码?5步实现毫秒级响应的高性能服务集成
  • 英伟达推出云端算力集群监管工具,自证GPU无后门
  • 如何用智能配色工具3步打造品牌视觉一致性
  • 【OD刷题笔记】- 分苹果
  • MCP SC-400从入门到精通,构建抗量子攻击防线的关键路径
  • Bigemap Pro水文分析三大核心功能详解:从DEM到精准河网提取
  • Java学习日志--常见类库(上)
  • 直播带货APP开发的核心流程:推流端、观看端与运营端后台搭建指南
  • Wan2.2-T2V-A14B生成火星殖民基地建设构想视频
  • TSF输入法框架开发全指南:从COM组件到拼音输入法落地
  • 在线考试软件哪个好用?
  • 在AWS Athena中使用json_extract_scalar函数对某个json字段进行过滤和分组统计
  • 力扣 22. 括号生成:C++ 实现回溯 + 动态规划双解法,面试高频题必掌握
  • 【开题答辩全过程】以 基于Django的大学生理财及记账系统设计与实现为例,包含答辩的问题和答案
  • Rust的移动语义
  • 生物毒性在线分析仪:监测水体毒性的利器
  • english-13-word-25-12-11 ,get down to business 言归正传 , peripheral devices 从属设备【蓝牙主机host从机Peripheral】
  • 3倍效率!用AI自动修复Vue属性传递问题
  • OpenJob完全指南:如何快速上手高性能分布式任务调度框架
  • 基于密集型复杂城市场景下求解无人机三维路径规划的Q-learning 算法研究附Matlab代码
  • vnpy可视化技术终极指南:从零构建专业K线图表交易界面
  • 降息利好板块