簡體   English   中英

您可以聲明可變長度的泛型類型聲明嗎?

[英]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”起作用, TU都應實現一些定義明確的接口或從一個基類繼承(否則,您將進行大量反射,這有點違背了使用的目的泛型)。 因此,請考慮:

Action<int> CheckDuration<T>(Action<T> action, params T[] args)
    where T : ISupportCheckDuration

而且您將可以在其中填充與ISupportCheckDuration兼容的任何內容。

看看PostSharp:

http://www.postsharp.org/

我認為它可以幫助您。 看一下跟蹤示例。 我認為您可以對其進行調整以執行計時。 然后,您可以將屬性添加到需要計時的任何方法中,而不管它采用的參數數量如何。

克里斯

對於泛型來說是不可能的,但是對於C ++ / CLI的可變參數模板(當它獲得支持時),您可以做到。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM