背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口
背水一战 Windows 10 (122) - 其它: 通过 Windows.System.Profile 命名空间下的类获取信息, 查找指定类或接口的所在程序集的所有子类和子接口
作者:webabcd
介绍
背水一战 Windows 10 之 其它
- 通过 Windows.System.Profile 命名空间下的类获取信息
- 查找指定类或接口的所在程序集的所有子类和子接口
示例
1、演示如何通过 Windows.System.Profile 命名空间下的类获取信息
Information/ProfileInfo.xaml
<Page x:Class="Windows10.Information.ProfileInfo" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Information" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="0 10 10 10" /> </StackPanel> </Grid> </Page>
Information/ProfileInfo.xaml.cs
/* * 演示如何通过 Windows.System.Profile 命名空间下的类获取信息 * * 主要可获取到设备类型,系统版本号等 */ using System; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.System.Profile; namespace Windows10.Information { public sealed partial class ProfileInfo : Page { public ProfileInfo() { this.InitializeComponent(); this.Loaded += ProfileInfo_Loaded; } private void ProfileInfo_Loaded(object sender, RoutedEventArgs e) { // 获取设备类型,目前已知的返回字符串有:Windows.Mobile, Windows.Desktop, Windows.Xbox lblMsg.Text = string.Format("DeviceFamily: {0}", AnalyticsInfo.VersionInfo.DeviceFamily); lblMsg.Text += Environment.NewLine; // 获取系统版本号,一个长整型值 lblMsg.Text += string.Format("DeviceFamilyVersion: {0}", AnalyticsInfo.VersionInfo.DeviceFamilyVersion); lblMsg.Text += Environment.NewLine; // 将长整型的系统版本号转换为 major.minor.revision.build 的方式 string versionString = AnalyticsInfo.VersionInfo.DeviceFamilyVersion; ulong version = ulong.Parse(versionString); ulong v1 = (version & 0xFFFF000000000000L) >> 48; ulong v2 = (version & 0x0000FFFF00000000L) >> 32; ulong v3 = (version & 0x00000000FFFF0000L) >> 16; ulong v4 = (version & 0x000000000000FFFFL); string v = $"{v1}.{v2}.{v3}.{v4}"; lblMsg.Text += string.Format("DeviceFamilyVersion(major.minor.revision.build): {0}", v); lblMsg.Text += Environment.NewLine; // 获取当前的“向 Microsoft 发送你的设备数据”的收集等级。在“设置”->“隐私”->“反馈和诊断”中配置(Security, Basic, Enhanced, Full) lblMsg.Text += string.Format("PlatformDiagnosticsAndUsageDataSettings.CollectionLevel: {0}", PlatformDiagnosticsAndUsageDataSettings.CollectionLevel); lblMsg.Text += Environment.NewLine; // 检查当前配置是否允许指定级别的信息收集 lblMsg.Text += string.Format("PlatformDataCollectionLevel.Full: {0}", PlatformDiagnosticsAndUsageDataSettings.CanCollectDiagnostics(PlatformDataCollectionLevel.Full)); lblMsg.Text += Environment.NewLine; // 在“设置”->“隐私”->“反馈和诊断”中配置的“向 Microsoft 发送你的设备数据”发生变化时触发的事件 PlatformDiagnosticsAndUsageDataSettings.CollectionLevelChanged += PlatformDiagnosticsAndUsageDataSettings_CollectionLevelChanged; } private async void PlatformDiagnosticsAndUsageDataSettings_CollectionLevelChanged(object sender, object e) { await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () => { lblMsg.Text += string.Format("PlatformDiagnosticsAndUsageDataSettings.CollectionLevel: {0}", PlatformDiagnosticsAndUsageDataSettings.CollectionLevel); lblMsg.Text += Environment.NewLine; lblMsg.Text += string.Format("PlatformDataCollectionLevel.Full: {0}", PlatformDiagnosticsAndUsageDataSettings.CanCollectDiagnostics(PlatformDataCollectionLevel.Full)); lblMsg.Text += Environment.NewLine; }); } } }
2、用于查找指定类或接口的所在程序集的所有子类和子接口
Tools/FindSubClass.xaml
<Page x:Class="Windows10.Tools.FindSubClass" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:Windows10.Tools" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Grid Background="Transparent"> <ScrollViewer Margin="10 0 10 10"> <StackPanel Name="root" Margin="5"> <Button Name="btnFind" Content="查找指定类或接口的所在程序集的所有子类或子接口" Margin="1 5 1 20" Click="btnFind_Click" /> </StackPanel> </ScrollViewer> </Grid> </Page>
Tools/FindSubClass.xaml.cs
/* * 用于查找指定类或接口的所在程序集的所有子类和子接口 */ using System; using System.Reflection; using System.Collections.Generic; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using System.Linq; namespace Windows10.Tools { public sealed partial class FindSubClass : Page { public FindSubClass() { this.InitializeComponent(); } private void btnFind_Click(object sender, RoutedEventArgs e) { // 这样不行 // Type type = Type.GetType("Windows.UI.Xaml.Controls.Button"); Type type = typeof(Windows.UI.Xaml.UIElement); List<Type> subTypes = GetSubTypes(type); AddWrapGrid(subTypes); } private void AddWrapGrid(List<Type> subTypes) { VariableSizedWrapGrid wrapGrid = CreateWrapGrid(); root.Children.Add(wrapGrid); foreach (Type type in subTypes) { Button button = CreateButton(type); wrapGrid.Children.Add(button); } } private void Button_Click(object sender, RoutedEventArgs e) { FrameworkElement button = sender as FrameworkElement; Type type = button.Tag as Type; int index = 0; // 删除被选中按钮的所属容器,以及此容器之后的所有控件 if (button.Parent.GetType() == typeof(VariableSizedWrapGrid)) index = root.Children.IndexOf(button.Parent as UIElement); // 删除被选中按钮,以及此按钮之后的所有控件 else index = root.Children.IndexOf(button); while (root.Children.Count > index) { root.Children.RemoveAt(root.Children.Count - 1); } // 将被选中按钮添加到根容器 Button buttonNew = CreateButton(type); root.Children.Add(buttonNew); root.Children.Add(new Grid() { Height = 20 }); // 将被选中类的所有子类添加到根容器 List<Type> subTypes = GetSubTypes(type); AddWrapGrid(subTypes); } private VariableSizedWrapGrid CreateWrapGrid() { VariableSizedWrapGrid wrapGrid = new VariableSizedWrapGrid(); wrapGrid.Orientation = Orientation.Vertical; wrapGrid.ItemWidth = 9999; wrapGrid.HorizontalAlignment = HorizontalAlignment.Stretch; return wrapGrid; } private Button CreateButton(Type type) { Button button = new Button(); button.Content = type.ToString(); button.Margin = new Thickness(1); button.Tag = type; button.Click += Button_Click; return button; } // 获取儿子类,孙子及以下级别不会返回 private List<Type> GetSubTypes(Type type) { List<Type> subTypes = new List<Type>(); Type[] assemblyTypes = type.GetTypeInfo().Assembly.GetTypes(); foreach (Type t in assemblyTypes) { if (type.GetTypeInfo().IsInterface) { if (t.GetInterfaces().Contains(type)) { subTypes.Add(t); } } else { if (t.GetTypeInfo().BaseType == type) { subTypes.Add(t); } } } subTypes = subTypes.OrderBy(p => p.FullName).ToList(); return subTypes; } } }
OK
[源码下载]