public ITypeDescriptor Create(Type type)
{
SerializerTypeInfo result;
if (_typeOrDescriptor2Info.TryGetValue(type, out result)) return result.Descriptor;
if (_typeOrDescriptor2InfoNew.TryGetValue(type, out result)) return result.Descriptor;
ITypeDescriptor desc = null;
if (!type.IsSubclassOf(typeof(Delegate)))
{
if (type.IsGenericType)
{
if (type.GetGenericTypeDefinition().InheritsOrImplements(typeof(IList<>)))
{
desc = new ListTypeDescriptor(this, type);
}
else if (type.GetGenericTypeDefinition().InheritsOrImplements(typeof(IDictionary<,>)))
{
desc = new DictionaryTypeDescriptor(this, type);
}
}
else if (type.IsArray)
{
desc = new ListTypeDescriptor(this, type);
}
else if (type.IsEnum)
{
desc = new EnumTypeDescriptor(this, type);
}
else
{
desc = new ObjectTypeDescriptor(this, type);
}
}
if (desc == null) throw new BTDBException("Don't know how to serialize type " + type.ToSimpleName());
result = new SerializerTypeInfo
{
Id = 0,
Descriptor = desc
};
_typeOrDescriptor2InfoNew[desc] = result;
_typeOrDescriptor2InfoNew[type] = result;
if (!desc.FinishBuildFromType(this))
{
throw new BTDBException("Don't know how to serialize type " + type.ToSimpleName());
}
return desc;
}