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;
}
}
上述的代码是优化之后的代码,这里其实就是用到了一个反射并且调用了反射类的方法
总结
优化永无止境。感谢大家的支持!