据我所知,在运行时无法动态添加属性。除了将它们直接添加到声明之外,在编译时也没有办法添加属性。在我看来,这是很好的,因为它保持了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();
}
谢谢。麻烦的是我对CSharp很新,所以我相信这只会加重我的困难。我确切知道我想要什么,只是不知道如何去做。你发布的代码看起来不错,我不知道如何在非psudo代码中实现它。 – chris12892 2010-06-05 04:09:39
@ chris12892我认为它实际上非常非伪代码,你唯一需要做的就是在List>'上使用'TryGetKey'。我可能建议寻找'IEnumerable.SingleOrDefault'? –
2010-06-05 04:18:12
我编辑了这个向你展示我的意思......希望它有帮助。我也使'HashTable'类成为一个泛型类,所以你并不总是必须使用'object'(为了可读性而使用其他一些东西)。 – 2010-06-05 04:31:24