C# 使用自定义特性标注类的方法,直接在当前类中让Main函数调用它

有的时候我们想要在Main执行一些代码,如果直接在里面写的话,下次再想测试新的代码的时候就会把之前的代码删掉,好不容易写的代码不想删掉

于是我们可以将这些代码写到类文件中,想要执行了,就在Main中调用该类的方法,

但是有的时候我们又懒的去Main函数指定的,有没有什么办法能直接在新类中就能指定让Main函数调用它呢

实现思路:

1,使用自定义特征标注方法

2,为了让Main函数选择它,需要时间数据,通过时间数据判断最新方法

3,然后在Main函数中循环程序集下所有类的所有方法,寻找最新的方法

4,最后通过Activator.CreateInstance重建类,并调用这个方法

   public static class Program {
       static void Main(string[] args) {
           try {
               TestAttribute.Run();
               Log.Info("end");
           } catch (Exception ex) {
               Console.WriteLine(ex.ToString());
           }
           Log.Info("任意键退出...");
           Console.ReadKey();
           Console.WriteLine("1111");
       }
   }
   /// <summary>
   /// 自定义测试特性
   /// </summary>
   public class TestAttribute : Attribute {
       /// <summary>
       /// 使用时间来判断最终选择哪个
       /// </summary>
       public DateTime Time;
       /// <summary>
       /// 使用特性是传入时间数据,用来标注最终选择
       /// </summary>
       public TestAttribute(int year, int month, int day, int hour = 0, int minute = 0, int second = 0) {
           Time = new DateTime(year, month, day, hour, minute, second);
       }
       static IEnumerable<(DateTime time, Type type, MethodInfo mi)> GetTesters() {
           foreach (var type in Assembly.GetExecutingAssembly().GetTypes()) { //循环程序集下所有的类
               foreach (var method in type.GetMethods()) { //循环每个类下的所有方法
                   TestAttribute ta = method.GetCustomAttribute<TestAttribute>();
                   if (ta != null) {
                       yield return (ta.Time, type, method); //记录标注了自定义特性的方法
                   }
               }
           }
       }
       /// <summary>
       /// 运行当前程序集下标注为Test特性中时间字段最新的方法
       /// </summary>
       public static void Run() {
           var (time, type, mi) = GetTesters().OrderByDescending(p => p.time).First(); //得到最新时间的一个方法的相关信息
           var obj = Activator.CreateInstance(type); //创建对象
           mi.Invoke(obj, null); //执行方法
       }
   }

使用方法很简单,只需要保证特性传入的时间是最新的即可

    internal class Tester {
        [Test(2024, 1, 29, 18)]
        public void Test() {
            Console.WriteLine("不去Main中改代码,就能直接调用当前类的Test方法");
        }
    }

 

posted @ 2024-01-29 18:29  WmW  阅读(15)  评论(0编辑  收藏  举报