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

结果:​​​​​​​

相关推荐
心平气和量大福大6 小时前
C#-WPF-布局-Grid
c#·wpf·visual studio
TeamDev7 小时前
JxBrowser 9.3.1 版本发布啦!
java·前端·javascript·c#·混合应用·jxbrowser·浏览器控件
格林威9 小时前
工业相机Chunk功能全解析:图像嵌入时间戳、编码器元数据(附堡盟C#代码)
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
Vae_Mars9 小时前
C#中多线程异步操作的方法-Parallel.ForEachAsync
开发语言·c#·php
Arbori_2621510 小时前
Rider 调试 VisionMaster C# 用户脚本
c#·visionmaster
暗暗别做白日梦13 小时前
Pulsar 消息同步机制
c#·linq
海盗123413 小时前
微软技术周报——2026-07-22
microsoft·c#·.net
海盗123413 小时前
微软技术日报 ——2026-07-21
microsoft·c#·.net
-银雾鸢尾-13 小时前
C#中的泛型约束
开发语言·c#
WWJA王文举14 小时前
单片机参数如何掉电保存:Flash、EEPROM和配置存储完整设计
数据库·stm32·mongodb·c#