編寫高質量程式碼改善程式的157個建議:使用Dynamic來簡化反射的實現

2023-07-24 21:00:48

概述

  最近在看《編寫高質量程式碼改善C#程式的157個建議》。看到第15個建議的時候,結合平時使用的習慣發現有部分出入,沒有對不對的說法,只是使用習慣有點區別,跟隨著我們來看一看。

  第15條建議是:使用dynamic簡化反射的使用dynamic的確可以簡化反射的使用,但是從效能上來說是有條件的,大家可以根據自己情況選擇。

案例

  原書的案例如下:

static void Main(string[] args)
{
    int times = 1;
    DynamicSample dynamicSample = new DynamicSample();
    var addMethod = typeof(DynamicSample).GetMethod("Add");

    Stopwatch watch1 = Stopwatch.StartNew();
    int result = 0;
    for (int i = 0; i < times; i++)
    {
        result = (int)addMethod.Invoke(dynamicSample, new object[] { 1, 2 });
    }
    Console.WriteLine(string.Format("正常的反射耗時:{0}毫秒", watch1.ElapsedMilliseconds));
    Console.WriteLine("正常反射的結果:" + result);
    /****************************************************************************************************/

    dynamic dynamicSample2 = new DynamicSample();
    int result2 = 0;
    Stopwatch watch2 = Stopwatch.StartNew();
    for (int i = 0; i < times; i++)
    {
        result2 = dynamicSample2.Add(1, 2);
    }
    Console.WriteLine(string.Format("Dynamic的反射耗時:{0}毫秒", watch2.ElapsedMilliseconds));
    Console.WriteLine("Dynamic反射的結果:" + result2);
    /****************************************************************************************************/

    DynamicSample reflectSamplebetter = new DynamicSample();
    var addMethod2 = typeof(DynamicSample).GetMethod("Add");
    var delg = (Func<DynamicSample, int, int, int>)Delegate.CreateDelegate(typeof(Func<DynamicSample, int, int, int>), addMethod2);
    int result3 = 0;
    Stopwatch watch3 = Stopwatch.StartNew();
    for (int i = 0; i < times; i++)
    {
        result3 = delg(reflectSamplebetter, 1, 2);
    }
    Console.WriteLine(string.Format("優化的反射耗時:{0}毫秒", watch3.ElapsedMilliseconds));
    Console.WriteLine("優化的反射結果:" + result3);
    /****************************************************************************************************/

    Console.Read();
}
//測試實體類
public class DynamicSample
{
    public string Name { get; set; }
    public int Add(int a, int b)
    {
        return a + b;
    }
}

執行一次迴圈的結果如下: