我不太理解为什么我们需要在下面的代码中按AND
逐位应用BindingFlags.Types
:
switch (binding.flags & BindingFlags.Types) {
case BindingFlags.TypeElementAttribute:
setElementAttribute(view, binding, renderNode, binding.ns, name, value);
break;
case BindingFlags.TypeElementClass:
setElementClass(view, renderNode, name, value);
break;
case BindingFlags.TypeElementStyle:
setElementStyle(view, binding, renderNode, name, value);
break;
case BindingFlags.TypeProperty:
const bindView = (def.flags & NodeFlags.ComponentView &&
binding.flags & BindingFlags.SyntheticHostProperty) ?
elData.componentView :
view;
setElementProperty(bindView, binding, renderNode, name, value);
break;
}
这里是BindingFlags
的定义:
export const enum BindingFlags {
TypeElementAttribute = 1 << 0,
TypeElementClass = 1 << 1,
TypeElementStyle = 1 << 2,
TypeProperty = 1 << 3,
SyntheticProperty = 1 << 4,
SyntheticHostProperty = 1 << 5,
CatSyntheticProperty = SyntheticProperty | SyntheticHostProperty,
// mutually exclusive values...
Types = TypeElementAttribute | TypeElementClass | TypeElementStyle | TypeProperty
}
有人可以澄清吗?
答案 0 :(得分:1)
我不太了解为什么我们需要通过下面的代码中的BindingFlags.Types应用逻辑AND:
这是一个按位 AND(&
),而不是一个逻辑(&&
)。
您需要使用它来过滤掉其他位(例如SyntheticProperty
)。 BindingFlags.Type
仅包含TypeXYZ
位。
例如,如果binding.flags
同时具有SyntheticProperty
(0b00010000)和TypeElementClass
(0b00000010),则其值为0b00010010。由于switch
仅需要匹配类型的标志,因此它使用BindingFlags.Types
与&
(0b00001111)掩盖非类型的值。 0b00010010&0b00001111是0b0001000,因此它与SyntheticProperty
大小写匹配。