在所述结构之外的结构中创建新属性

时间:2010-06-05 03:40:47

标签: c# embedded

这很难解释,所以请耐心等待。

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

    class testClass
{
    public function __construct()
    {
    }
}

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

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

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

谢谢!

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

您需要做的就是实现适当的界面;完成此操作后,任何动态使用对象的客户端代码都可以访问动态属性(和方法),就像PHP示例一样。

参考文献,如果你想了解更多...