obfuz/Editor/Emit/GroupByModuleEntityManager.cs

75 lines
2.1 KiB
C#
Raw Normal View History

2025-05-07 19:39:09 +08:00
using dnlib.DotNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Obfuz.Emit
{
public interface IGroupByModuleEntity
2025-05-07 19:39:09 +08:00
{
void Init(ModuleDef mod);
}
public abstract class GroupByModuleEntityBase : IGroupByModuleEntity
2025-05-07 19:39:09 +08:00
{
public abstract void Init(ModuleDef mod);
}
2025-05-11 08:53:48 +08:00
public class GroupByModuleEntityManager
2025-05-07 19:39:09 +08:00
{
2025-05-11 08:53:48 +08:00
public static GroupByModuleEntityManager Ins { get; private set; }
2025-05-07 19:39:09 +08:00
private readonly Dictionary<(ModuleDef, Type), IGroupByModuleEntity> _moduleEmitManagers = new Dictionary<(ModuleDef, Type), IGroupByModuleEntity>();
2025-05-07 19:39:09 +08:00
public static void Reset()
{
2025-05-11 08:53:48 +08:00
Ins = new GroupByModuleEntityManager();
2025-05-07 19:39:09 +08:00
}
public T GetEntity<T>(ModuleDef mod, Func<T> creator = null) where T : IGroupByModuleEntity
2025-05-07 19:39:09 +08:00
{
var key = (mod, typeof(T));
if (_moduleEmitManagers.TryGetValue(key, out var emitManager))
{
return (T)emitManager;
}
else
{
T newEmitManager;
if (creator != null)
{
2025-05-09 20:18:24 +08:00
newEmitManager = creator();
2025-05-07 19:39:09 +08:00
}
else
{
newEmitManager = (T)Activator.CreateInstance(typeof(T));
}
newEmitManager.Init(mod);
_moduleEmitManagers[key] = newEmitManager;
return newEmitManager;
}
}
public List<T> GetEntities<T>() where T: IGroupByModuleEntity
2025-05-07 19:39:09 +08:00
{
var managers = new List<T>();
foreach (var kv in _moduleEmitManagers)
{
if (kv.Key.Item2 == typeof(T))
{
managers.Add((T)kv.Value);
}
}
return managers;
}
2025-05-11 08:53:48 +08:00
public DefaultMetadataImporter GetDefaultModuleMetadataImporter(ModuleDef module)
{
2025-05-11 08:53:48 +08:00
return GetEntity<DefaultMetadataImporter>(module);
}
2025-05-07 19:39:09 +08:00
}
}