Вары не всегда имеют корневую привязку. Допустимо создавать переменную без привязки, используя
(def x)
или
(declare x)
Попытка оценить x до того, как он получит значение, приведет к
Var user/x is unbound.
[Thrown class java.lang.IllegalStateException]
Анонимные типы, сгенерированные из 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 {} }
}
Как узнать, является ли тип анонимным с помощью отражения?
Думаю, вы можете проверить, имеет ли тип атрибут CompilerGenerated
Свойства анонимных типов не могут быть назначены, поэтому отражение сообщает правильно.
Если вы посмотрите на скомпилированный IL, вы:
Не существует надежного способа определить, является ли тип анонимным, поскольку среда выполнения .NET 2.0 не поддерживает анонимные типы. Использование формата «сгенерированного компилятором имени» не является безопасным решением, так как это может измениться с разными версиями компилятора.
Похоже, вы ответили на свой собственный вопрос относительно «Как я могу проверить, может ли свойство быть записано в "с помощью приведенных выше операторов: CanWrite имеет значение false, а GetSetMethod (true) возвращает значение null. Это два признака того, что вы не можете записать в свойство.
Поскольку мы находимся в среде выполнения .NET 2.0, в System.Type нет свойства IsAnonymous, поэтому у вас действительно нет надежного метода для идентификации анонимного типа.