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

结果:​​​​​​​

相关推荐
z落落17 小时前
C# 事件(Event)+自定义带参数事件例子
开发语言·分布式·c#
FlYFlOWERANDLEAF17 小时前
DevExpress Office File API使用记录
开发语言·c#·devoffice
richard_yuu18 小时前
C#工业上位机项目实战第九篇:可视化流程引擎完整落地,节点拖拽、连线渲染与自动化调度
c#·自动化
njsgcs19 小时前
c# solidworks 创建装配体工程图+bom
开发语言·c#·solidworks
njsgcs19 小时前
c# solidworks 工程图获得展开视图不在固定面螺纹特征的位置
开发语言·c#·solidworks
深海潜水员1 天前
【从零开始的C#游戏开发课程】- FarmStory1.0 日志系统和游戏资源的管理
游戏·c#·monogame
叶帆1 天前
【YFIOs】用C#开发硬件之WiFi网络
开发语言·网络·c#
天下无敌笨笨熊1 天前
C# LINQ开发心得
c#·linq
小白不白1111 天前
Invoke的用法
开发语言·人工智能·数码相机·计算机视觉·c#
FuckPatience1 天前
C# 链表元素的引用地址分析
链表·c#