Создание новых свойств в структуре вне указанной структуры - PullRequest
2 голосов
/ 05 июня 2010

Это довольно сложно объяснить, поэтому терпите меня.

В PHP, если вы хотите создать новое свойство в классе, вы можете ничего не делать. Следующий код будет работать отлично.

    class testClass
{
    public function __construct()
    {
    }
}

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

Я хотел бы сделать то же самое, только в C # и со структурой. Это возможно?

Да, я знаю, это звучит очень неуклюже. Я пытаюсь смоделировать своего рода ассоциативный массив, где его нет. В моей среде (NET Microframeworks) хеш-таблицы и словари не поддерживаются (пока).

Спасибо!

Ответы [ 3 ]

3 голосов
/ 05 июня 2010

Не имитируйте ассоциативный массив - идите и напишите его.

3 голосов
/ 05 июня 2010

Насколько я знаю, нет способа динамически добавлять свойства во время выполнения. Также нет способа добавить свойства во время компиляции, кроме добавления их непосредственно в объявление. На мой взгляд, это хорошо, поскольку поддерживает безопасность типов, ожидаемую от 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 голос
/ 05 июня 2010

В C # версии 4.0, выпущенной с .NET 4.0 и Visual Studio 2010, новый псевдо-тип dynamic может позволить вам делать то, что вы хотите - хотя если вы новичок в C # (как вы кажется, что) скорее всего, используемые методы будут немного глубже.

Все, что вам нужно сделать, это реализовать соответствующий интерфейс; как только это будет сделано, любой клиентский код, который использует ваш объект динамически, может получить доступ к свойствам (и методам) «на лету», как ваш пример PHP.

Ссылки, если вы хотите узнать больше ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...