c#拦截构造函数参数

时间:2019-03-12 20:57:15

标签: c# reflection

我正在尝试使用C#编写作业排队系统。

假设我有以下课程,代表以后要做的工作:

  public class TestJob : QueuableJob
    {
        private readonly string _t;
        private readonly string _e;
        public TestJob(string t, string e)
        {
            _t = t;
            _e = e;

        }
        public Task PerformWork(ITestService testService)
        {
            testService.Message($"Hello: {_t} {_e}");
            return Task.CompletedTask;
        }
    }

我希望能够打电话给类似的人

JobQueueService.EnqueueJob(new TestJob("value1", "value2"));

为了使作业排队,我需要序列化传递给TestJob的构造函数的参数,以便可以将它们存储在持久层(例如数据库)中,然后反序列化它们。然后,我可以实例化该类并执行PerformWork。我想在我的库中尽可能无缝地处理此问题,因此最终用户编写“ Job”类时不必担心要添加特定的东西进行序列化。

我无法想出一种方法来“拦截”传递给TestJob类的参数,而又不会丢失严格的键入(例如,我可以使用params object[] parameters)或迫使最终用户实施其他一些方法代码以帮助进行序列化。

目前,我能想到的(对于最终用户)最优雅的解决方案是这样的:

public class TestJob : QueuableJob
    {
        private readonly string _t;
        private readonly string _e;
        public TestJob(string t, string e) : base(t,e)
        {
            _t = t;
            _e = e;

        }
        public Task PerformWork(ITestService testService)
        {
            testService.Message($"Hello: {_t} {_e}");
            return Task.CompletedTask;
        }
    }

但是,这将要求开发人员记住将其所有参数传递给base()(例如上例中的base(t,e))。如果他们忘记这样做,编译器将不会抱怨,因此它可能是棘手的错误的来源。 我还尝试过在QueuableJob构造函数中使用System.Diagnostics.StackTrace获取信息,但是它不相信我可以从堆栈中获取参数的 values

有什么方法可以使用反射来“拦截”传递给TestJob构造函数的内容吗?

0 个答案:

没有答案