夜光序言:
想过最多的是就是很多事就是身不由己,有好多时候,都要面对无奈,有多少时候,那些事让人啼笑皆非
正文:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace 案例3
{
//这里我们主要讲下反射
class UpdateAttribute : Attribute
{
}
class A
{
[Update]
public void aa(int i)
{
Console.WriteLine("aa{0}", i);
}
}
class B
{
[Update]
public void bb(int i)
{
Console.WriteLine("bb{0}", i);
}
}
class Program
{
/// <summary>
/// 遍历一个类中所有的方法,找到并返回被标记为update的方法
/// </summary>
/// <param name="ti">一个类的类型信息</param>
/// <returns>如果找到返回该方法的方法信息,否则返回空</returns>
static MethodInfo GetUpdateMethod(TypeInfo ti)
{
//取到所有的方法
MethodInfo[] miArray = ti.GetMethods();
//下面我们再写一个循环
for(int i = 0; i < miArray.Length; i++)
{
MethodInfo mi = miArray[i];
//接下来就是判断的过程
//判断mi是否为一个被标记为update的方法
if (mi.GetCustomAttribute<UpdateAttribute>() != null) //用的是一种叫泛型的方法,之前讲过
{
return mi;
}
}
return null; //表示没有找到
}
/// <summary>
/// 我们也可以封装成一个静态方法
/// </summary>
/// <param name="mi"></param>
/// <param name="caller"></param>
/// <param name="parms"></param>
static void CallMethod(MethodInfo mi,object caller,object[] parms)
{
mi.Invoke(caller, parms);
}
static void Main(string[] args)
{
//1. 遍历类A和类B,看看有没有标记为update的方法,有的话,取出该方法
MethodInfo miA = GetUpdateMethod(typeof(A).GetTypeInfo()); //aa
MethodInfo miB = GetUpdateMethod(typeof(B).GetTypeInfo()); //bb
A a = new A();
B b = new B();
//2. 在游戏循环中每帧调用该方法
for (int i = 0; !Console.KeyAvailable; i++)
{
//第一种方式
/* miA.Invoke(a, new object[] { i });
miB.Invoke(b, new object[] { i });*/
//第二种方式
CallMethod(miA, a, new object[] { i });
CallMethod(miB, b, new object[] { i });
}
Console.ReadLine();
}
}
}