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

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

准备:

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

cs 复制代码
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();
    }
}

方案一:

代码如下:

cs 复制代码
   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方法中调用

cs 复制代码
    void Start()
    {
        CallAnimalByName("Dog");
    }

结果:

方案二:

代码如下:

cs 复制代码
    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方法中调用:

cs 复制代码
void Start()
{
   RegisterWindow<Duck>();
   CallAnimalByName2("Duck");
}

结果:​​​​​​​

相关推荐
arbboter3 小时前
【网络工具】NetProxy网络代理用户手册
开发语言·网络·c#·网络代理·网络异常·代理工具
微小冷3 小时前
海康威视相机C#二次开发环境配置
数码相机·c#·.net·海康威视·相机开发
吴可可1237 小时前
C#重写机制与CAD图元开发要点
c#
A_nanda7 小时前
c#WPF开发常见问题
开发语言·c#·wpf
唐青枫7 小时前
别只会解析参数:C#.NET Spectre.Console.Cli 命令行工具实战详解
c#·.net
AI刀刀8 小时前
腾讯元宝粘贴到 word 格式混乱,AI 导出鸭一键规整排版
人工智能·c#·word·ai导出鸭
微小冷9 小时前
海康威视相机C#二次开发指图像采集
数码相机·c#·二次开发·机器视觉·海康威视·mvs·相机开发
rick97711 小时前
WinForms 父子窗体数据传递的进化之路:从参数注入到事件回传的完美闭环
c#
淡海水12 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#
在世修行12 小时前
从零打造 C# 工业视觉检测系统(十五):项目打包部署与进阶展望
开发语言·c#·视觉检测