Насколько я знаю, нет способа динамически добавлять свойства во время выполнения. Также нет способа добавить свойства во время компиляции, кроме добавления их непосредственно в объявление. На мой взгляд, это хорошо, поскольку поддерживает безопасность типов, ожидаемую от C #.
Однако не могли бы вы создать примитивную хеш-таблицу с использованием List<KeyValuePair<int, List<KeyValuePair<string, object>>>>
и String.GetHashCode()
? Что-то вроде следующего (непроверенный и частично псевдокод, но вы поняли):
class HashTable<T>
{
private List<KeyValuePair<int, List<KeyValuePair<string, T>>>> _table =
new List<KeyValuePair<int, List<KeyValuePair<string, T>>>>();
private void Set(string key, T value)
{
var hashcode = key.GetHashCode();
List<KeyValuePair<string, T>> l;
if(!_table.TryGetValue(hashcode, out l))
{
l = new List<KeyValuePair<string, T>>();
_table.Add(hashcode, l);
}
T o;
if(l.TryGetValue(key, out o))
{
if (o != value)
l.Single(x => x.Key == key).Value = o;
}
else
l.Add(new KeyValuePair(key, value));
}
private T Get(string key)
{
List<KeyValuePair<string, T>> l;
object o;
if(!(_table.TryGetValue(hashcode, out l) &&
!l.TryGetValue(key, out o)))
{
throw new ArgumentOutOfRangeException("key");
}
return o;
}
}
Следующее должно помочь вам с TryGetValue
:
public bool TryGetValue<TKey, TValue>(this List<KeyValuePair<TKey, TValue>> list,
TKey key, out TValue value)
{
var query = list.Where(x => x.Key == key);
value = query.SingleOrDefault().Value;
return query.Any();
}