mirror of
https://github.com/ppy/osu.git
synced 2025-02-14 23:33:23 +08:00
Use a more traditional method of caching
This commit is contained in:
parent
81c9d831f4
commit
a622a0b660
@ -4,6 +4,7 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
@ -167,7 +168,30 @@ namespace osu.Game.Configuration
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IEnumerable<(SettingSourceAttribute, PropertyInfo)> GetSettingsSourceProperties<T>(this T obj) => SettingSourceCache<T>.SettingSourceProperties;
|
private static readonly ConcurrentDictionary<Type, IEnumerable<(SettingSourceAttribute, PropertyInfo)>> property_info_cache = new ConcurrentDictionary<Type, IEnumerable<(SettingSourceAttribute, PropertyInfo)>>();
|
||||||
|
|
||||||
|
public static IEnumerable<(SettingSourceAttribute, PropertyInfo)> GetSettingsSourceProperties(this object obj)
|
||||||
|
{
|
||||||
|
var type = obj.GetType();
|
||||||
|
|
||||||
|
if (!property_info_cache.TryGetValue(type, out var properties))
|
||||||
|
property_info_cache[type] = properties = getSettingsSourceProperties(type);
|
||||||
|
|
||||||
|
return properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static IEnumerable<(SettingSourceAttribute, PropertyInfo)> getSettingsSourceProperties(Type type)
|
||||||
|
{
|
||||||
|
foreach (var property in type.GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance))
|
||||||
|
{
|
||||||
|
var attr = property.GetCustomAttribute<SettingSourceAttribute>(true);
|
||||||
|
|
||||||
|
if (attr == null)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
yield return (attr, property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static ICollection<(SettingSourceAttribute, PropertyInfo)> GetOrderedSettingsSourceProperties(this object obj)
|
public static ICollection<(SettingSourceAttribute, PropertyInfo)> GetOrderedSettingsSourceProperties(this object obj)
|
||||||
=> obj.GetSettingsSourceProperties()
|
=> obj.GetSettingsSourceProperties()
|
||||||
@ -185,14 +209,5 @@ namespace osu.Game.Configuration
|
|||||||
protected override DropdownMenu CreateMenu() => base.CreateMenu().With(m => m.MaxHeight = 100);
|
protected override DropdownMenu CreateMenu() => base.CreateMenu().With(m => m.MaxHeight = 100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class SettingSourceCache<T>
|
|
||||||
{
|
|
||||||
public static (SettingSourceAttribute, PropertyInfo)[] SettingSourceProperties { get; } =
|
|
||||||
typeof(T).GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)
|
|
||||||
.Select(property => (property.GetCustomAttribute<SettingSourceAttribute>(), property))
|
|
||||||
.Where(pair => pair.Item1 != null)
|
|
||||||
.ToArray();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user