C# 如何通过利用委托来提高代码重用?
我正在编写一个类,它利用C# 如何通过利用委托来提高代码重用?,c#,methods,delegates,code-reuse,C#,Methods,Delegates,Code Reuse,我正在编写一个类,它利用USING语句连接到服务器上的任务调度器并“做事情”;比如启用/禁用任务、启动和停止等。我想提高代码重用,可能是通过使用委托,但我不确定如何进行。以下是我当前的一些代码: private static void StopRunningTask(string taskName, string hostName) { Regex regex = GetRegexForFindTask(taskName); using (TaskService ts = new T
USING
语句连接到服务器上的任务调度器并“做事情”;比如启用/禁用任务、启动和停止等。我想提高代码重用,可能是通过使用委托,但我不确定如何进行。以下是我当前的一些代码:
private static void StopRunningTask(string taskName, string hostName)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true))
{
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase) && t.State == TaskState.Running)
t.Stop();
}
}
private static void RunTask(string taskName, string hostName)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true))
{
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase) && t.State == TaskState.Ready)
t.Run();
}
}
private static void ChangeTaskEnabledState(string taskName, bool enabled, string hostName)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true))
{
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
t.Enabled = enabled;
}
}
private static Regex GetRegexForFindTask(string taskName)
{
var regex = new Regex(string.Format(@"{0}", taskName), RegexOptions.IgnoreCase);
return regex;
}
您可以只为该方法提供一个回调,例如
private static void FindTasks(string taskName, string hostName, Action<Task> callback)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true))
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
callback(t);
}
}
显然,尽管您的FindTask
实现看起来略有不同(您在某些情况下检查IsEnabled等),因此您可以在匿名委托中使用类似的方法进行检查:
FindTask("SomeTaskName", "SomeHost", (task) =>
{
// Check if it is running first
if(t.IsRunning) t.Enabled = false;
});
或者您可以向FindTask
方法传递一个谓词来过滤列表-让我来研究一下语法
编辑:类似于:
public static void FindTask(string taskName, string hostName, Expression<Func<T, bool>> filter, Action<Task> callback)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true).Where(filter)) // Use linq filter here to narrow down the list of tasks
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
callback(t);
}
}
因此,它只会在IsEnabled
任务上运行回调
显然,然后你必须想知道你能把什么放入谓词中!余额由您决定:)
不过,您需要考虑的唯一一件事是,允许另一个用户(可能是第三方)使用这一功能可以让他们对任务做任何他们想做的事情,因为他们可以获得任务的实例来操作。至少在最初的实现中,您仅限于指定的操作。(如果只是供您自己使用/内部使用,这对您来说可能不是问题)您可以只为该方法提供一个回调-例如
private static void FindTasks(string taskName, string hostName, Action<Task> callback)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true))
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
callback(t);
}
}
显然,尽管您的FindTask
实现看起来略有不同(您在某些情况下检查IsEnabled等),因此您可以在匿名委托中使用类似的方法进行检查:
FindTask("SomeTaskName", "SomeHost", (task) =>
{
// Check if it is running first
if(t.IsRunning) t.Enabled = false;
});
或者您可以向FindTask
方法传递一个谓词来过滤列表-让我来研究一下语法
编辑:类似于:
public static void FindTask(string taskName, string hostName, Expression<Func<T, bool>> filter, Action<Task> callback)
{
Regex regex = GetRegexForFindTask(taskName);
using (TaskService ts = new TaskService(hostName))
{
foreach (Task t in ts.FindAllTasks(regex, true).Where(filter)) // Use linq filter here to narrow down the list of tasks
if (t.Name.Equals(taskName, StringComparison.OrdinalIgnoreCase))
callback(t);
}
}
因此,它只会在IsEnabled
任务上运行回调
显然,然后你必须想知道你能把什么放入谓词中!余额由您决定:)
不过,您需要考虑的唯一一件事是,允许另一个用户(可能是第三方)使用这一功能可以让他们对任务做任何他们想做的事情,因为他们可以获得任务的实例来操作。至少在最初的实现中,您仅限于指定的操作。(如果只是供您自己使用/内部使用,这对您来说可能不是问题)非常感谢您的帮助。非常感谢您的帮助。