Получите свойства чтения/записи Анонимного Типа

Вары не всегда имеют корневую привязку. Допустимо создавать переменную без привязки, используя

(def x)

или

(declare x)

Попытка оценить x до того, как он получит значение, приведет к

Var user/x is unbound.
[Thrown class java.lang.IllegalStateException]
12
задан Jim Counts 14 July 2011 в 19:47
поделиться

4 ответа

Анонимные типы, сгенерированные из C #, всегда неизменяемы, поэтому набор доступных для записи свойств пуст. В VB это необязательно: каждое свойство по умолчанию является изменяемым, но если вы добавите к нему префикс Key , оно неизменяемо; только свойства, объявленные с использованием ключа , учитываются для равенства и генерации хэш-кода. Лично я предпочитаю подход C #.

CanWrite не всегда возвращается как истина для свойств в неанонимных типах - только для доступных для записи. Свойства могут быть доступны только для чтения, только для записи или чтения-записи. Например:

public class Test
{
    // CanWrite will return false. CanRead will return true.
    public int ReadOnly { get { return 10; } }

    // CanWrite will return true. CanRead will return false.
    public int WriteOnly { set {} }

    // CanWrite will return true. CanRead will return true.
    public int ReadWrite { get { return 10; } set {} }
}
18
ответ дан 2 December 2019 в 07:03
поделиться

Как узнать, является ли тип анонимным с помощью отражения?

Думаю, вы можете проверить, имеет ли тип атрибут CompilerGenerated

1
ответ дан 2 December 2019 в 07:03
поделиться

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

Если вы посмотрите на скомпилированный IL, вы:

1
ответ дан 2 December 2019 в 07:03
поделиться

Не существует надежного способа определить, является ли тип анонимным, поскольку среда выполнения .NET 2.0 не поддерживает анонимные типы. Использование формата «сгенерированного компилятором имени» не является безопасным решением, так как это может измениться с разными версиями компилятора.

Похоже, вы ответили на свой собственный вопрос относительно «Как я могу проверить, может ли свойство быть записано в "с помощью приведенных выше операторов: CanWrite имеет значение false, а GetSetMethod (true) возвращает значение null. Это два признака того, что вы не можете записать в свойство.

Поскольку мы находимся в среде выполнения .NET 2.0, в System.Type нет свойства IsAnonymous, поэтому у вас действительно нет надежного метода для идентификации анонимного типа.

2
ответ дан 2 December 2019 в 07:03
поделиться
Другие вопросы по тегам:

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