C#中类的反射以及调用小妙招

C#中类的反射以及调用小妙招

介绍

最近看到原来同事写的代码感叹了一下,优化这个东西确实是永无止境的,其实就是不了解类的反射和返回值的使用。

原始代码

csharp 复制代码
public void OnExit(Frame f, QFSMAnimatorEnum state, PlayerFSMRef playerFSMRef)
{
	switch (status)
    {
    	case QFSMAnimatorEnum.None:
            break;
        case QFSMAnimatorEnum.Idle:
            QFSMAnimatorStateIdle.OnExit(f, playerFSMRef);
            break;
        case QFSMAnimatorEnum.Run:
        	QFSMAnimatorStateRun.OnExit(f, playerFSMRef);
	        break;
       	case QFSMAnimatorEnum.HasFrisbeeIdle:
        	QFSMAnimatorStateHasFrisbeeIdle.OnExit(f, playerFSMRef);
            break;
        case QFSMAnimatorEnum.HasFrisbeeRun:
            QFSMAnimatorStateHasFrisbeeRun.OnExit(f, playerFSMRef);
            break;
        case QFSMAnimatorEnum.ReceivingFrisbee:
            QFSMAnimatorStateReceivingFrisbee.OnExit(f, playerFSMRef);
            break;
        case QFSMAnimatorEnum.ThrowingFrisbeeL:
            QFSMAnimatorStateThrowingFrisbeeL.OnExit(f, playerFSMRef);
            break;
        case QFSMAnimatorEnum.ThrowingFrisbeeR:
            QFSMAnimatorStateThrowingFrisbeeR.OnExit(f, playerFSMRef);
            break;
      	case QFSMAnimatorEnum.ThrowingFrisbeeH:
            QFSMAnimatorStateThrowingFrisbeeH.OnExit(f, playerFSMRef);
            break;
        default:
            break;            
    }
}

当你看到上面的代码的时候你发现重复性质的调用太多了,写起来会非常累

类的反射

csharp 复制代码
	Type stateType = Type.GetType($"Namespace.QFSMAnimatorState{status}");
    if (stateType != null)
    {
        MethodInfo onExitMethod = stateType.GetMethod("OnExit");
        onExitMethod?.Invoke(null, new object[] { f, playerFSMRef });
    }

注意:使用这个反射时 Type.GetType($"Namespace.XXXXClass")要加上类的命名空间和类名称
GetMethod("xxx")可以获取反射的类的方法
?.Invoke()方法是有一个object类型的返回值,就是对应方法的返回值(需要自己拆箱处理转成原返回值类型)

修改之后的代码

csharp 复制代码
public void OnExit(Frame f, QFSMAnimatorEnum state, PlayerFSMRef playerFSMRef)
{
	switch (status)
	{
    	case QFSMAnimatorEnum.None:
        	break;
    	default:
        	Type stateType = Type.GetType($"Namespace.QFSMAnimatorState{status}");
        	if (stateType != null)
        	{
            	MethodInfo onExitMethod = stateType.GetMethod("OnExit");
            	onExitMethod?.Invoke(null, new object[] { f, playerFSMRef });
        	}
        	break;
	}
}

上述的代码是优化之后的代码,这里其实就是用到了一个反射并且调用了反射类的方法

总结

优化永无止境。感谢大家的支持!

相关推荐
SchuylerEX3 小时前
第六章 JavaScript 互操(3)JS调用.NET
前端·javascript·c#·.net·blazor
小乖兽技术4 小时前
C#开发基础之深入理解“集合遍历时不可修改”的异常背后的设计
开发语言·windows·c#
姜行运4 小时前
数据结构【红黑树】
数据结构·c++·c#
LZQqqqqo5 小时前
C# 接口(interface 定义接口的关键字)
java·开发语言·c#
BuHuaX6 小时前
Unity_UI_NGUI_缓动
ui·unity·c#·游戏引擎·游戏策划
Humbunklung21 小时前
C# WPF 实现读取文件夹中的PDF并显示其页数
pdf·c#·wpf·npoi·gemini·itext
时光追逐者1 天前
C#/.NET/.NET Core技术前沿周刊 | 第 48 期(2025年7.21-7.27)
c#·.net·.netcore·.net core
蓝点lilac1 天前
C# 调用邮箱应用发送带附件的邮件
c#·.net
工程师0071 天前
C#多线程,同步与异步详解
开发语言·c#·多线程·同步·异步编程
小乖兽技术1 天前
在 .NET 中使用 Base64 时容易踩的坑总结
开发语言·c#·.net