< Summary

Information
Class: Amusoft.Toolkit.Mvvm.Core.RestorePropertyRestoreStrategyProvider
Assembly: Amusoft.Toolkit.Mvvm.Core
File(s): /home/runner/work/Amusoft.Toolkit.Mvvm/Amusoft.Toolkit.Mvvm/src/Amusoft.Toolkit.Mvvm.Core/Navigation/RestorePropertyRestoreStrategyProvider.cs
Tag: 8_14199367891
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 66
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 4
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
GetStrategies()100%210%
.ctor(...)100%210%
get_Priority()100%210%
CollectRestoreInformation(...)0%620%
get_Storage()100%210%
Recreate()0%620%

File(s)

/home/runner/work/Amusoft.Toolkit.Mvvm/Amusoft.Toolkit.Mvvm/src/Amusoft.Toolkit.Mvvm.Core/Navigation/RestorePropertyRestoreStrategyProvider.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Reflection;
 5
 6using Microsoft.Extensions.DependencyInjection;
 7
 8namespace Amusoft.Toolkit.Mvvm.Core;
 9
 10internal class RestorePropertyRestoreStrategyProvider : IRestoreStrategyProvider
 11{
 12  private readonly IServiceProvider _serviceProvider;
 13
 014  public RestorePropertyRestoreStrategyProvider(IServiceProvider serviceProvider)
 15  {
 016    _serviceProvider = serviceProvider;
 017  }
 18
 19  public IEnumerable<IRestoreStrategy<T>> GetStrategies<T>()
 20  {
 021    yield return new Strategy<T>(_serviceProvider);
 022  }
 23
 24  private class Strategy<T> : IRestoreStrategy<T>
 25  {
 26    private readonly IServiceProvider _serviceProvider;
 27
 028    public Strategy(IServiceProvider serviceProvider)
 29    {
 030      _serviceProvider = serviceProvider;
 031    }
 32
 033    public int Priority { get; }
 34
 35    public void CollectRestoreInformation(T model)
 36    {
 037      var properties = typeof(T)
 038        .GetProperties(BindingFlags.GetProperty | BindingFlags.SetProperty | BindingFlags.Instance);
 039      Storage = properties
 040        .Where(d => CustomAttributeExtensions.GetCustomAttribute<RestorePropertyAttribute>(d) != null)
 041        .Select(d => (accessor: d, originalValue: d.GetValue(model)))
 042        .ToArray();
 043    }
 44
 045    private (PropertyInfo accessor, object? originalValue)[] Storage { get; set; } = [];
 46
 47    public T Recreate()
 48    {
 049      var instance = _serviceProvider.GetRequiredService<T>();
 050      foreach (var tuple in Storage)
 51      {
 052        tuple.accessor.SetValue(instance, tuple.originalValue);
 53      }
 54
 055      return instance;
 56    }
 57  }
 58}
 59
 60/// <summary>
 61/// Use this attribute to define properties that are persisted to restore the state of a viewmodel if its reference expi
 62/// </summary>
 63[AttributeUsage(AttributeTargets.Property)]
 64public class RestorePropertyAttribute : Attribute
 65{
 66}