Как я могу динамично добавить поле к классу в C#

Вы можете использовать np.diag , чтобы извлечь k -ю диагональ, а затем сложить ее.

{str(i):np.sum(np.diag(match_score_matrix,k=i)) for i in range(-15,8)}

23
задан Pero P. 9 August 2012 в 23:28
поделиться

6 ответов

Вы не можете изменить определение класса во времени выполнения. Однако можно создать новый класс, который наследовался исходному классу (если это не sealed), и объявляет поле. Можно сделать это путем испускания соответствующего кода IL с помощью System.Reflection.Emit.

26
ответ дан 29 November 2019 в 01:52
поделиться

C# не позволяет его, потому что весь он - классы, основаны на Метаданных. CLR (не C#) запрещает добавление полей к метаданным во времени выполнения (1). Это - единственный способ, которым C# был бы в состоянии добавить поле в runitme.

Это непохоже на динамические языки, такие как IronPython, которые по существу не имеют конкретных классов метаданных. У них есть более динамические структуры, которые могут быть altereted во времени выполнения. Я полагаю, что IronPython просто сохраняет, это - участники (поля и методы) в том, какие суммы к хеш-таблице, которая может быть легко изменена во времени выполнения.

В C# 3.0, Ваш лучший ресурс должен использовать Отражение. Испустить. Но это генерирует совершенно новый класс по сравнению с изменением существующего.

(1) существуют определенные API, такие как профильные API или ENC, которые позволяют это, но я не уверен, расширяются ли их возможности до добавляющих полей.

7
ответ дан 29 November 2019 в 01:52
поделиться

Нет, C# не позволяет исправление обезьяны .

можно генерировать новый классы с помощью или CodeDOM или Отражения. Испустите, но Вы не можете изменить существующие.

6
ответ дан 29 November 2019 в 01:52
поделиться

Не точно.

Однако можно реализовать ICustomTypeDescriptor, чтобы приблизить его и затем просто использовать хеш-таблицу для хранения пар имени поля/значения. Много платформы, которая использует отражение, просит ICustomTypeDescriptor сначала.

1
ответ дан 29 November 2019 в 01:52
поделиться

Только в C# 4.0, который добавляет динамический поиск и основан на CLR 4.0, который включает ДОЛЛАР и затем он не будет строго добавлять к классу, поскольку классы не будут в изображении.

1
ответ дан 29 November 2019 в 01:52
поделиться

как другие уже сказали, это не возможно. Какова причина Вашего вопроса? Если необходимо хранить некоторые дополнительные данные в классе динамично, то Вы могли, вероятно, просто использовать словарь:

class My { 
   Dictionary<string, object> data;
   public My() { data = new Dictionary<string, object>(); }
}

.. но это действительно зависит от того, чего Вы на самом деле хотите достигнуть?

1
ответ дан 29 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: