MixinData
using System;
using System.Collections.Generic;
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 = mixinInstance.GetType().GetInterfaces();
Type[] array = interfaces;
foreach (Type type in array) {
list.Add(type);
if (dictionary.ContainsKey(type)) {
string message = $"""{type.FullName}""{dictionary[type].GetType().Name}""{mixinInstance.GetType().Name}""";
throw new ArgumentException(message, "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 (object.ReferenceEquals(this, obj))
return true;
MixinData mixinData = obj as MixinData;
if (object.ReferenceEquals(mixinData, null))
return false;
if (mixinsImpl.Count != mixinData.mixinsImpl.Count)
return false;
for (int i = 0; i < mixinsImpl.Count; i++) {
if (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];
}
}
}