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

结果:​​​​​​​

相关推荐
Traced back8 小时前
怎么用 Modbus 让两个设备互相通信**,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。
开发语言·c#
一个帅气昵称啊9 小时前
基于.NET AgentFramework开发OpenClaw智能体框架
人工智能·自然语言处理·c#·.net·openclaw
唐青枫10 小时前
C#.NET SpinLock 深入解析:自旋锁原理、使用边界与性能取舍
c#·.net
CSharp精选营17 小时前
.NET对象转JSON,到底有几种方式?
c#·json·.net·newtonsoft·对象转换·utf8json
bcbobo21cn18 小时前
C#引用类型学习
开发语言·c#·值类型·引用类型
天下无敌笨笨熊18 小时前
C#异步开发探微
开发语言·c#
mudtools19 小时前
存储那么贵,何不白嫖飞书云文件空间
前端框架·c#·.net
我是唐青枫19 小时前
C#.NET SignalR + Redis Backplane 深入解析:多节点部署与跨实例消息同步
c#·.net
星河Cynthia20 小时前
WPF基于resx资源文件的多语言实现
c#·wpf