CommandLineUtils.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System; 6 using System.Linq; 7 using System.Reflection; 8 9 using Microsoft.PowerToys.Settings.UI.Library.Interfaces; 10 11 namespace Microsoft.PowerToys.Settings.UI.Library; 12 13 public class CommandLineUtils 14 { 15 private static Type GetSettingsConfigType(string moduleName, Assembly settingsLibraryAssembly) 16 { 17 var settingsClassName = moduleName == "GeneralSettings" ? moduleName : moduleName + "Settings"; 18 return settingsLibraryAssembly.GetType(typeof(CommandLineUtils).Namespace + "." + settingsClassName); 19 } 20 21 public static ISettingsConfig GetSettingsConfigFor(string moduleName, SettingsUtils settingsUtils, Assembly settingsLibraryAssembly) 22 { 23 return GetSettingsConfigFor(GetSettingsConfigType(moduleName, settingsLibraryAssembly), settingsUtils); 24 } 25 26 /// Executes SettingsRepository<moduleSettingsType>.GetInstance(settingsUtils).SettingsConfig 27 public static ISettingsConfig GetSettingsConfigFor(Type moduleSettingsType, SettingsUtils settingsUtils) 28 { 29 var genericSettingsRepositoryType = typeof(SettingsRepository<>); 30 var moduleSettingsRepositoryType = genericSettingsRepositoryType.MakeGenericType(moduleSettingsType); 31 32 // Note: GeneralSettings is only used here only to satisfy nameof constrains, i.e. the choice of this particular type doesn't have any special significance. 33 var getInstanceInfo = moduleSettingsRepositoryType.GetMethod(nameof(SettingsRepository<GeneralSettings>.GetInstance)); 34 var settingsRepository = getInstanceInfo.Invoke(null, new object[] { settingsUtils }); 35 var settingsConfigProperty = getInstanceInfo.ReturnType.GetProperty(nameof(SettingsRepository<GeneralSettings>.SettingsConfig)); 36 return settingsConfigProperty.GetValue(settingsRepository) as ISettingsConfig; 37 } 38 39 public static Assembly GetSettingsAssembly() 40 { 41 return AppDomain.CurrentDomain.GetAssemblies() 42 .FirstOrDefault(a => a.GetName().Name == "PowerToys.Settings.UI.Lib"); 43 } 44 45 public static object GetPropertyValue(string propertyName, ISettingsConfig settingsConfig) 46 { 47 var (settingInfo, properties) = LocateSetting(propertyName, settingsConfig); 48 return settingInfo.GetValue(properties); 49 } 50 51 public static object GetProperties(ISettingsConfig settingsConfig) 52 { 53 var settingsType = settingsConfig.GetType(); 54 if (settingsType == typeof(GeneralSettings)) 55 { 56 return settingsConfig; 57 } 58 59 var settingsConfigInfo = settingsType.GetProperty("Properties"); 60 return settingsConfigInfo.GetValue(settingsConfig); 61 } 62 63 public static (PropertyInfo SettingInfo, object Properties) LocateSetting(string propertyName, ISettingsConfig settingsConfig) 64 { 65 var properties = GetProperties(settingsConfig); 66 var propertiesType = properties.GetType(); 67 if (propertiesType == typeof(GeneralSettings) && propertyName.StartsWith("Enabled.", StringComparison.InvariantCulture)) 68 { 69 var moduleNameToToggle = propertyName.Replace("Enabled.", string.Empty); 70 properties = propertiesType.GetProperty("Enabled").GetValue(properties); 71 propertiesType = properties.GetType(); 72 propertyName = moduleNameToToggle; 73 } 74 75 return (propertiesType.GetProperty(propertyName), properties); 76 } 77 78 public static PropertyInfo GetSettingPropertyInfo(string propertyName, ISettingsConfig settingsConfig) 79 { 80 return LocateSetting(propertyName, settingsConfig).SettingInfo; 81 } 82 }