private void WritePropertyWithExtension(BamlPropertyWithExtension node) { _blob.Write(ref _pos, (byte)RecordType.PropertyWithExtension); _blob.Write(ref _pos, (short)GetPropertyId(node.DeclaringProperty)); var extension = node.Extension; short flags = (short)extension.Type; if (node.IsValueType) { flags |= 0x4000; } if (node.IsStaticType) { flags |= 0x2000; } _blob.Write(ref _pos, (short)flags); _blob.Write(ref _pos, (short)GetExtensionValueId(extension.Value)); }
private void ReadPropertyWithExtension() { var node = new BamlPropertyWithExtension(); node.DeclaringProperty = GetProperty(_accessor.ReadInt16()); short flags = _accessor.ReadInt16(); short valueId = _accessor.ReadInt16(); node.IsValueType = (flags & 0x4000) == 0x4000; node.IsStaticType = (flags & 0x2000) == 0x2000; var extensionType = (BamlExtensionType)(flags & 0xfff); BamlExtensionValue value; switch (extensionType) { case BamlExtensionType.StaticExtension: { value = GetStaticExtensionValue(valueId); } break; case BamlExtensionType.StaticResource: case BamlExtensionType.DynamicResource: { if (node.IsValueType) { value = new BamlExtensionTypeValue(GetType(valueId)); } else if (node.IsStaticType) { value = GetStaticExtensionValue(valueId); } else { value = new BamlExtensionStringValue(GetString(valueId)); } } break; case BamlExtensionType.TemplateBinding: { value = new BamlExtensionPropertyValue(GetProperty(valueId)); } break; case BamlExtensionType.Type: { value = new BamlExtensionTypeValue(GetType(valueId)); } break; default: { value = new BamlExtensionStringValue(GetString(valueId)); } break; } node.Extension = new BamlExtension(extensionType, value); AddNode(node); }