2010-06-05 57 views
2

这是很难解释的,所以请耐心等待。在结构中创建新的属性,在上述结构之外

在PHP中,如果你想在一个类中创建一个新的属性,你可以不做任何事情。以下代码将完美工作。

class testClass 
{ 
    public function __construct() 
    { 
    } 
} 

$test = new testClass; 
$test->propone = "abc"; 
echo $test->propone; 

我想做同样的事情,只有在C#和结构。这可能吗?

是的,我知道,这听起来真的很笨拙。我试图模拟一种没有的关联数组。在我的环境(NET Microframeworks)中,不支持哈希表和字典(还)。

谢谢!

回答

3

据我所知,在运行时无法动态添加属性。除了将它们直接添加到声明之外,在编译时也没有办法添加属性。在我看来,这是很好的,因为它保持了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(); 
} 
+0

谢谢。麻烦的是我对CSharp很新,所以我相信这只会加重我的困难。我确切知道我想要什么,只是不知道如何去做。你发布的代码看起来不错,我不知道如何在非psudo代码中实现它。 – chris12892 2010-06-05 04:09:39

+1

@ chris12892我认为它实际上非常非伪代码,你唯一需要做的就是在List >'上使用'TryGetKey'。我可能建议寻找'IEnumerable.SingleOrDefault'? – 2010-06-05 04:18:12

+0

我编辑了这个向你展示我的意思......希望它有帮助。我也使'HashTable'类成为一个泛型类,所以你并不总是必须使用'object'(为了可读性而使用其他一些东西)。 – 2010-06-05 04:31:24

3

不要模仿关联数组 - 去写一个并使用它。

1

在.NET 4.0和Visual Studio 2010中发布的C#版本4.0中,新的伪类型动态可以让你做你想做的事 - 尽管如果你是C#的新手(因为你似乎是)所涉及的技术可能会有点深。

您需要做的只是实现适当的接口;一旦完成,动态使用你的对象的任何客户端代码都可以访问动态属性(和方法),就像你的PHP示例一样。如果您想了解更多

引用...