<PackageReference Include="Castle.Core" Version="4.3.0" />

MixinData

public class MixinData
using System; using System.Collections.Generic; using System.Reflection; namespace Castle.DynamicProxy { public class MixinData { private readonly Dictionary<Type, int> mixinPositions = new Dictionary<Type, int>(); private readonly List<object> mixinsImpl = new List<object>(); public IEnumerable<Type> MixinInterfaces => mixinPositions.Keys; public IEnumerable<object> Mixins => mixinsImpl; public MixinData(IEnumerable<object> mixinInstances) { if (mixinInstances != null) { List<Type> list = new List<Type>(); Dictionary<Type, object> dictionary = new Dictionary<Type, object>(); foreach (object mixinInstance in mixinInstances) { Type[] interfaces = TypeExtensions.GetInterfaces(mixinInstance.GetType()); foreach (Type type in interfaces) { list.Add(type); if (dictionary.ContainsKey(type)) throw new ArgumentException($"""{type.FullName}""{dictionary[type].GetType().get_Name()}""{mixinInstance.GetType().get_Name()}""", "mixinInstances"); dictionary[type] = mixinInstance; } } list.Sort((Type x, Type y) => x.FullName.CompareTo(y.FullName)); for (int j = 0; j < list.Count; j++) { Type key = list[j]; object item = dictionary[key]; mixinPositions[key] = j; mixinsImpl.Add(item); } } } public bool ContainsMixin(Type mixinInterfaceType) { return mixinPositions.ContainsKey(mixinInterfaceType); } public override bool Equals(object obj) { if (this == obj) return true; MixinData mixinData = obj as MixinData; if (mixinData == null) return false; if (mixinsImpl.Count != mixinData.mixinsImpl.Count) return false; for (int i = 0; i < mixinsImpl.Count; i++) { if ((object)mixinsImpl[i].GetType() != mixinData.mixinsImpl[i].GetType()) return false; } return true; } public override int GetHashCode() { int num = 0; foreach (object item in mixinsImpl) { num = 29 * num + item.GetType().GetHashCode(); } return num; } public object GetMixinInstance(Type mixinInterfaceType) { return mixinsImpl[mixinPositions[mixinInterfaceType]]; } public int GetMixinPosition(Type mixinInterfaceType) { return mixinPositions[mixinInterfaceType]; } } }