Я не думаю, что за это есть конкуренция. Вы хотите ассоциативный массив времени выполнения - это словарь.
Вот как бы я это сделал:
public class Config
{
private Dictionary<Type, Dictionary<string, object>> _store
= new Dictionary<Type, Dictionary<string, object>>();
public void Store<T>(string key, T value)
{
if (!_store.ContainsKey(typeof(T)))
{
_store.Add(typeof(T), new Dictionary<string, object>());
}
_store[typeof(T)][key] = value;
}
public T Fetch<T>(string key)
{
return (T)_store[typeof(T)][key];
}
}
Тогда вы можете написать этот код:
var config = new Config();
config.Store<int>("Life", 42);
config.Store<string>("Hello", "World");
int x = config.Fetch<int>("Life");
string y = config.Fetch<string>("Hello");
Console.WriteLine(x);
Console.WriteLine(y);
Это выводит:
42
World
Все строго напечатано и очень быстро.
Конечно, это быстро собираемый класс. Тебе нужно убедиться, что ты правильно излагаешь это. Как вы должны справиться с ситуацией, когда у вас есть недостающие ключи? Бросать исключение, как правило, не лучшая идея. Я бы посмотрел на реализацию public bool TryFetch<T>(string key, out T value)
по крайней мере. Тогда вы не полагаетесь на исключения.
Возможно, попробуйте эти методы:
public bool TryFetch<T>(string key, out T value)
{
var success = _store.ContainsKey(typeof(T)) && _store[typeof(T)].ContainsKey(key);
value = success ? this.Fetch<T>(key) : default(T);
return success;
}
public bool TryInject<T>(string key, Action<T> inject)
{
var success = this.TryFetch<T>(key, out T value);
if (success)
{
inject(value);
}
return success;
}