.net 需要更新泛型方法中的引用值-如何使其更清晰?

pbpqsu0x  于 2023-10-21  发布在  .NET
关注(0)|答案(1)|浏览(92)
  • 我需要更新~30个参数。
  • 更新取决于LastUpdated字段。
  • 每个参数都有自己的LastUpdated字段。
  • 这是IoT Device Twin的ETL过程(这意味着我不能更改输入JSON),所以我想尽可能快地完成它(没有不必要的解析)。

下面是泛型方法:

private static (T value, DateTime? lastUpdate) UpdateSourceIfNewer<T>(T sourceValue, DateTime? sourceLastUpdate, T inputValue, DateTime? inputLastUpdate)
 {
     if (inputValue != null &&
        (sourceLastUpdate is null || sourceLastUpdate < inputLastUpdate))
     {
         sourceValue = inputValue;
         sourceLastUpdate = inputLastUpdate?.LastUpdated;
     }

     return (sourceValue, sourceLastUpdate);

但是这个方法需要的代码对我来说不是很干净(下面)。还是比一堵如果墙好,但是有没有办法让它更干净?

(src.Param1, src.Param1LastUpdated) = UpdateSourceIfNewer(
     src.Param1, src.Param1LastUpdated, input.Param1, input.Metadata.Param1);
 (src.Param2, src.Param2LastUpdated) = UpdateSourceIfNewer(
     src.Param2, src.Param2LastUpdated, input.Param2, input.Metadata.Param2);
 /// another ~30 parameters

编辑:裁判不会工作。当sourceValue为null时,不传播更改。

ngynwnxp

ngynwnxp1#

可以使用ref

private static void UpdateSourceIfNewer<T>(ref T sourceValue, ref DateTime? sourceLastUpdate, T inputValue, DateTime? inputLastUpdate)
{
    if (inputValue != null &&
       (sourceLastUpdate is null || sourceLastUpdate < inputLastUpdate))
    {
        sourceValue = inputValue;
        sourceLastUpdate = inputLastUpdate;
    }
}

使用方法:

UpdateSourceIfNewer(ref src.Param1, ref src.Param1LastUpdated, input.Param1, input.Metadata.Param1);

编辑:在你说它不起作用之后,我创建了一个DotNetFiddle,我相信它确实起作用,对于我能想到的所有场景(它总是打印所有值都是相同的)。

在这样做的时候,我被迫对代码进行修复,因为我复制了您对inputLastUpdate?.LastUpdated的使用,但是因为inputLastUpdateDateTime?类型,所以我必须删除?.LastUpdated部分。也许这与你说它不起作用的原因有关,但我不知道为什么或如何。

相关问题