[英]Can you declare a variable length Generics type declaration?
我有一個名為CheckDuration
的重載實用程序方法,具有以下函數簽名。
private static Action<int> CheckDuration(Action action)
private static Action<int> CheckDuration<T>(Action<T> action, T arg)
基本上, CheckDuration
在控制台上打印運行一種方法所花費的時間。
現在,我想檢查一個帶有2個參數的方法的持續時間。
因此,我將不得不使用以下方法簽名來創建另一個重載的CheckDuration
。
private static Action<int> CheckDuration<T, U>(
Action<T, U> action, T arg1, U arg2)
有沒有一種方法可以更優雅地處理呢?
我在想類似的東西
private static Action<int> CheckDuration<params T>(
Action<params T> action, params T arg)
,這顯然不起作用。
[更新]我現在暫時不提這個問題,以查看是否有人想出解決此問題的方法。
不幸的是,您已經擁有的東西將變得干凈。 C#不支持將params
用於泛型類型參數,並且支持類似的操作非常困難。 您最初的解決方案是好的,並且秉持BCL中類似委托的精神,例如Action
委托,這些委托具有重載的定義以接受不同數量的參數。
您不能完全按照自己的意願進行操作,但是可以實現相同的目標:
public static class MethodTimer
{
public static long Run(Action action)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
action();
sw.Stop();
return sw.ElapsedMilliseconds;
}
}
class Program
{
static void Main(string[] args)
{
long time = MethodTimer.Run(() => File.Open(@"c:\test.txt",
FileMode.CreateNew));
Console.WriteLine(time);
Console.ReadLine();
}
}
您甚至可以將其定義為擴展方法,因此您的代碼可能是:
Action act = () => File.Open(@"c:\test.txt", FileMode.CreateNew);
time=act.Time();
該方法將定義為:
public static class MethodTimer
{
public static long Time(this Action action)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
action();
sw.Stop();
return sw.ElapsedMilliseconds;
}
}
編輯
您不需要定義任何新方法,此方法使用要計時的方法周圍的閉包。 所以:
MethodTimer.Time(()=> File.Open("",FileMode.Open);
MethodTimer.Time(()=> myObject.TestMethod(123,1231,"another param"));
等等等等。
不,沒有辦法。 但是,我想為了使此“ CheckDuration”起作用, T
和U
都應實現一些定義明確的接口或從一個基類繼承(否則,您將進行大量反射,這有點違背了使用的目的泛型)。 因此,請考慮:
Action<int> CheckDuration<T>(Action<T> action, params T[] args)
where T : ISupportCheckDuration
而且您將可以在其中填充與ISupportCheckDuration
兼容的任何內容。
看看PostSharp:
我認為它可以幫助您。 看一下跟蹤示例。 我認為您可以對其進行調整以執行計時。 然后,您可以將屬性添加到需要計時的任何方法中,而不管它采用的參數數量如何。
克里斯
對於泛型來說是不可能的,但是對於C ++ / CLI的可變參數模板(當它獲得支持時),您可以做到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.