C#中类的反射以及调用小妙招
- 介绍
- 原始代码
- 类的反射
- 修改之后的代码
- 总结
介绍
最近看到原来同事写的代码感叹了一下,优化这个东西确实是永无止境的,其实就是不了解类的反射和返回值的使用。
原始代码
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; }
}
当你看到上面的代码的时候你发现重复性质的调用太多了,写起来会非常累
类的反射
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类型的返回值,就是对应方法的返回值(需要自己拆箱处理转成原返回值类型)
修改之后的代码
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;}
}
上述的代码是优化之后的代码,这里其实就是用到了一个反射并且调用了反射类的方法
总结
优化永无止境。感谢大家的支持!