public void WriteVariantContents(object value, TypeInfo typeInfo)
{
// check for null.
if (value == null)
{
return;
}
m_commaRequired = false;
// write scalar.
if (typeInfo.ValueRank < 0)
{
switch (typeInfo.BuiltInType)
{
case BuiltInType.Boolean: { WriteBoolean(null, (bool)value); return; }
case BuiltInType.SByte: { WriteSByte(null, (sbyte)value); return; }
case BuiltInType.Byte: { WriteByte(null, (byte)value); return; }
case BuiltInType.Int16: { WriteInt16(null, (short)value); return; }
case BuiltInType.UInt16: { WriteUInt16(null, (ushort)value); return; }
case BuiltInType.Int32: { WriteInt32(null, (int)value); return; }
case BuiltInType.UInt32: { WriteUInt32(null, (uint)value); return; }
case BuiltInType.Int64: { WriteInt64(null, (long)value); return; }
case BuiltInType.UInt64: { WriteUInt64(null, (ulong)value); return; }
case BuiltInType.Float: { WriteFloat(null, (float)value); return; }
case BuiltInType.Double: { WriteDouble(null, (double)value); return; }
case BuiltInType.String: { WriteString(null, (string)value); return; }
case BuiltInType.DateTime: { WriteDateTime(null, (DateTime)value); return; }
case BuiltInType.Guid: { WriteGuid(null, (Uuid)value); return; }
case BuiltInType.ByteString: { WriteByteString(null, (byte[])value); return; }
case BuiltInType.XmlElement: { WriteXmlElement(null, (XmlElement)value); return; }
case BuiltInType.NodeId: { WriteNodeId(null, (NodeId)value); return; }
case BuiltInType.ExpandedNodeId: { WriteExpandedNodeId(null, (ExpandedNodeId)value); return; }
case BuiltInType.StatusCode: { WriteStatusCode(null, (StatusCode)value); return; }
case BuiltInType.QualifiedName: { WriteQualifiedName(null, (QualifiedName)value); return; }
case BuiltInType.LocalizedText: { WriteLocalizedText(null, (LocalizedText)value); return; }
case BuiltInType.ExtensionObject: { WriteExtensionObject(null, (ExtensionObject)value); return; }
case BuiltInType.DataValue: { WriteDataValue(null, (DataValue)value); return; }
case BuiltInType.Enumeration: { WriteInt32(null, (int)value); return; }
}
}
// write array.
else if (typeInfo.ValueRank <= 1)
{
switch (typeInfo.BuiltInType)
{
case BuiltInType.Boolean: { WriteBooleanArray(null, (bool[])value); return; }
case BuiltInType.SByte: { WriteSByteArray(null, (sbyte[])value); return; }
case BuiltInType.Byte: { WriteByteArray(null, (byte[])value); return; }
case BuiltInType.Int16: { WriteInt16Array(null, (short[])value); return; }
case BuiltInType.UInt16: { WriteUInt16Array(null, (ushort[])value); return; }
case BuiltInType.Int32: { WriteInt32Array(null, (int[])value); return; }
case BuiltInType.UInt32: { WriteUInt32Array(null, (uint[])value); return; }
case BuiltInType.Int64: { WriteInt64Array(null, (long[])value); return; }
case BuiltInType.UInt64: { WriteUInt64Array(null, (ulong[])value); return; }
case BuiltInType.Float: { WriteFloatArray(null, (float[])value); return; }
case BuiltInType.Double: { WriteDoubleArray(null, (double[])value); return; }
case BuiltInType.String: { WriteStringArray(null, (string[])value); return; }
case BuiltInType.DateTime: { WriteDateTimeArray(null, (DateTime[])value); return; }
case BuiltInType.Guid: { WriteGuidArray(null, (Uuid[])value); return; }
case BuiltInType.ByteString: { WriteByteStringArray(null, (byte[][])value); return; }
case BuiltInType.XmlElement: { WriteXmlElementArray(null, (XmlElement[])value); return; }
case BuiltInType.NodeId: { WriteNodeIdArray(null, (NodeId[])value); return; }
case BuiltInType.ExpandedNodeId: { WriteExpandedNodeIdArray(null, (ExpandedNodeId[])value); return; }
case BuiltInType.StatusCode: { WriteStatusCodeArray(null, (StatusCode[])value); return; }
case BuiltInType.QualifiedName: { WriteQualifiedNameArray(null, (QualifiedName[])value); return; }
case BuiltInType.LocalizedText: { WriteLocalizedTextArray(null, (LocalizedText[])value); return; }
case BuiltInType.ExtensionObject: { WriteExtensionObjectArray(null, (ExtensionObject[])value); return; }
case BuiltInType.DataValue: { WriteDataValueArray(null, (DataValue[])value); return; }
case BuiltInType.Enumeration:
{
Enum[] enums = value as Enum[];
string[] values = new string[enums.Length];
for (int ii = 0; ii < enums.Length; ii++)
{
string text = enums[ii].ToString();
text += "_";
text += ((int)(object)enums[ii]).ToString(CultureInfo.InvariantCulture);
values[ii] = text;
}
WriteStringArray(null, values);
return;
}
case BuiltInType.Variant:
{
Variant[] variants = value as Variant[];
if (variants != null)
{
WriteVariantArray(null, variants);
return;
}
object[] objects = value as object[];
if (objects != null)
{
WriteObjectArray(null, objects);
return;
}
throw ServiceResultException.Create(
StatusCodes.BadEncodingError,
"Unexpected type encountered while encoding an array of Variants: {0}",
value.GetType());
}
}
}
// write matrix.
else if (typeInfo.ValueRank > 1)
{
WriteMatrix(null, (Matrix)value);
return;
}
// oops - should never happen.
throw new ServiceResultException(
StatusCodes.BadEncodingError,
Utils.Format("Type '{0}' is not allowed in an Variant.", value.GetType().FullName));
}
#endregion