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

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

时间:2024-01-29 18:33:47浏览次数:25  
标签:自定义 int type 函数调用 Main 方法 public

有的时候我们想要再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

相关文章

  • 【如何更新自定义IP】自定义IP 的.V文件修改以后,一定要先进入platform Designer更新IP
    最近自定义了一个IP,添加到qsys以后,generateHDL....。再后来再有改动IP的.v文件时,我直接点generateHDL...发现电路最终没有更新。 需要如下操作:先进入platformDesigner更新IP,右击选择IP选择Edit: 点击分析和综合IP文件:  以后再generateQsy文件: 这样工程的......
  • 怎样用流程自定义表单提升办公效率?
    如果想要提升办公协作效率,可以试试低代码技术平台及流程自定义表单工具。不可否认的是,随着社会的进步和发展,传统的表单制作工具已经没有办法再满足业务量不断上涨的办公需求了,但是,借助专业的流程自定义表单工具就能很好地满足业务需求,实现高效式办公发展。那么,为什么现在低代码技......
  • 利用Mybatis拦截器实现自定义的ID自增器
    原生的Mybatis框架是没有ID自增器,但例如国产的MybatisPlus却是支持,不过,MybatisPlus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时MybatisPlus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义ID增长策略同时......
  • 自定义httpServletRequestWrapper导致上传文件请求参数丢失
    问题背景项目是SpringBoot单体式,在项目中,为了实现调用controller请求的日志记录功能。因此做了以下配置:创建自定义拦截器LogInterceptor;因为需要使用到流获取请求参数,解决流只能读一次问题,所以需要自定义HttpServletRequestWrapper;需要使得自定义HttpServletRequestW......
  • firefox 怎么自定义搜索引擎
     后面使用的时候,发现Firefox不能自定义搜索引擎了。从baidu、知乎上面搜索的结果,大部分都是打非所问的,不知道偏到哪里了。从stack上面找到的答案,记录一下 1、地址栏打开about:config2、搜索browser.urlbar.update2.engineAliasRefresh3、点击右侧的+4、现在,当您转到“......
  • vue3使用自定义指令实现图片懒加载
    //自定义指令app.directive('lazy',{mounted(el,binding){//绑定的元素,绑定的值//IntersectionObserver可以用来自动监听元素是否进入了设备的可视区域之内,而不需要频繁的计算来做这个判断constobserve=newIntersectionObserver(([{isIntersec......
  • 自定义路由事件
    路由事件相比.NET事件的优点为在最合适的位置编写紧凑的、组织良好的用于处理事件的代码提供了灵活性。Xaml无限套娃的树状结构,可以简单的在逻辑树上堆砌出定制按钮,而不必像Winform那样,动不动就要大费周章的自定义控件,比如带文字和图片的按钮,这时候,路由事件支持在父级控件上解......
  • [office] Excel中2010版使用自定义名称简化计算公式的操作技巧
    假设企业申报工资基数为员工的基本工资,用户可将“基本工资”所在单元格区域命名为“申报工资基数”,今天,小编就教大家在Excel中2010版使用自定义名称简化计算公式的操作技巧。Excel中2010版使用自定义名称简化计算公式的操作步骤选择“定义名称”选项,在“员工基本信......
  • 自定义对象比较器,结果失真怎么办?
    如果自定义对象比较器的结果失真,那么首先需要确认比较器的compare方法是否正确实现。在Java中,compare方法应该返回一个负整数、零或正整数,分别表示第一个参数小于、等于或大于第二个参数。例如,如果我们正在比较两个Student对象,我们可能会根据他们的身高或年龄来排序。但是,如果我......
  • 为了生成latex如何在sympy中自定义向量函数?适用于自定义类的latex生成。
    在sympy.printing.Printer的_print函数中可以看到一个hook,使得对于每一个类都会尝试寻找对应的_print_{class}函数来处理,因此我们只要利用好这个hook就可以为自定义类创建latex生成逻辑,我试图创建了一个_print_BoldUndefinedFunction函数,但发现它捕获不到(其实是因为BoldUndefinedF......