有的时候我们想要再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方法"); } }
标签:自定义,int,type,函数调用,Main,方法,public From: https://www.cnblogs.com/luludongxu/p/17995099