Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ IsCollectionOrTryCreate()

static bool System.Runtime.Serialization.CollectionDataContract.IsCollectionOrTryCreate ( Type type,
bool tryCreate,
out DataContract dataContract,
out Type itemType,
bool constructorRequired )
inlinestaticprivate

Definition at line 1110 of file CollectionDataContract.cs.

1111 {
1112 dataContract = null;
1113 itemType = Globals.TypeOfObject;
1114 if (DataContract.GetBuiltInDataContract(type) != null)
1115 {
1117 }
1119 bool flag = false;
1120 string deserializationExceptionMessage = null;
1121 Type baseType = type.BaseType;
1123 if (type.IsDefined(Globals.TypeOfDataContractAttribute, inherit: false))
1124 {
1126 }
1127 if (Globals.TypeOfIXmlSerializable.IsAssignableFrom(type) || IsArraySegment(type))
1128 {
1129 return false;
1130 }
1131 if (!Globals.TypeOfIEnumerable.IsAssignableFrom(type))
1132 {
1134 }
1137 if (type.IsInterface)
1138 {
1139 Type type2 = (type.IsGenericType ? type.GetGenericTypeDefinition() : type);
1141 for (int i = 0; i < knownInterfaces.Length; i++)
1142 {
1143 if (!(knownInterfaces[i] == type2))
1144 {
1145 continue;
1146 }
1147 addMethod = null;
1148 if (type.IsGenericType)
1149 {
1150 Type[] genericArguments = type.GetGenericArguments();
1151 if (type2 == Globals.TypeOfIDictionaryGeneric)
1152 {
1153 itemType = Globals.TypeOfKeyValue.MakeGenericType(genericArguments);
1154 addMethod = type.GetMethod("Add");
1155 method = Globals.TypeOfIEnumerableGeneric.MakeGenericType(Globals.TypeOfKeyValuePair.MakeGenericType(genericArguments)).GetMethod("GetEnumerator");
1156 }
1157 else
1158 {
1160 if (type2 == Globals.TypeOfICollectionGeneric || type2 == Globals.TypeOfIListGeneric)
1161 {
1162 addMethod = Globals.TypeOfICollectionGeneric.MakeGenericType(itemType).GetMethod("Add");
1163 }
1164 method = Globals.TypeOfIEnumerableGeneric.MakeGenericType(itemType).GetMethod("GetEnumerator");
1165 }
1166 }
1167 else
1168 {
1169 if (type2 == Globals.TypeOfIDictionary)
1170 {
1172 addMethod = type.GetMethod("Add");
1173 }
1174 else
1175 {
1176 itemType = Globals.TypeOfObject;
1177 if (type2 == Globals.TypeOfIList)
1178 {
1179 addMethod = type.GetMethod("Add");
1180 }
1181 }
1182 method = typeof(IEnumerable).GetMethod("GetEnumerator");
1183 }
1184 if (tryCreate)
1185 {
1186 dataContract = new CollectionDataContract(type, (CollectionKind)(i + 1), itemType, method, addMethod, null);
1187 }
1188 return true;
1189 }
1190 }
1192 if (!type.IsValueType)
1193 {
1194 constructorInfo = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, Type.EmptyTypes);
1195 if (constructorInfo == null && constructorRequired)
1196 {
1197 if (type.IsSerializable)
1198 {
1200 }
1201 flag = true;
1203 }
1204 }
1205 Type type3 = null;
1206 CollectionKind collectionKind = CollectionKind.None;
1207 bool flag2 = false;
1208 Type[] interfaces = type.GetInterfaces();
1209 Type[] array = interfaces;
1210 foreach (Type type4 in array)
1211 {
1212 Type type5 = (type4.IsGenericType ? type4.GetGenericTypeDefinition() : type4);
1214 for (int k = 0; k < knownInterfaces2.Length; k++)
1215 {
1216 if (knownInterfaces2[k] == type5)
1217 {
1218 CollectionKind collectionKind2 = (CollectionKind)(k + 1);
1219 if (collectionKind == CollectionKind.None || (int)collectionKind2 < (int)collectionKind)
1220 {
1222 type3 = type4;
1223 flag2 = false;
1224 }
1226 {
1227 flag2 = true;
1228 }
1229 break;
1230 }
1231 }
1232 }
1233 switch (collectionKind)
1234 {
1235 case CollectionKind.None:
1237 case CollectionKind.GenericEnumerable:
1238 case CollectionKind.Collection:
1239 case CollectionKind.Enumerable:
1240 if (flag2)
1241 {
1242 type3 = Globals.TypeOfIEnumerable;
1243 }
1244 itemType = (type3.IsGenericType ? type3.GetGenericArguments()[0] : Globals.TypeOfObject);
1246 if (addMethod == null)
1247 {
1248 if (type.IsSerializable)
1249 {
1251 }
1252 flag = true;
1254 }
1255 if (tryCreate)
1256 {
1258 }
1259 break;
1260 default:
1261 {
1262 if (flag2)
1263 {
1265 }
1266 Type[] array2 = null;
1267 switch (collectionKind)
1268 {
1269 case CollectionKind.GenericDictionary:
1270 {
1271 array2 = type3.GetGenericArguments();
1272 bool flag3 = type3.IsGenericTypeDefinition || (array2[0].IsGenericParameter && array2[1].IsGenericParameter);
1273 itemType = (flag3 ? Globals.TypeOfKeyValue : Globals.TypeOfKeyValue.MakeGenericType(array2));
1274 break;
1275 }
1276 case CollectionKind.Dictionary:
1277 array2 = new Type[2]
1278 {
1279 Globals.TypeOfObject,
1281 };
1282 itemType = Globals.TypeOfKeyValue.MakeGenericType(array2);
1283 break;
1284 case CollectionKind.GenericList:
1285 case CollectionKind.GenericCollection:
1286 array2 = type3.GetGenericArguments();
1287 itemType = array2[0];
1288 break;
1289 case CollectionKind.List:
1290 itemType = Globals.TypeOfObject;
1291 array2 = new Type[1] { itemType };
1292 break;
1293 }
1294 if (tryCreate)
1295 {
1298 }
1299 break;
1300 }
1301 }
1302 return true;
1303 }
static void GetCollectionMethods([DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.All)] Type type, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicMethods)] Type interfaceType, Type[] addMethodTypeArray, bool addMethodOnInterface, out MethodInfo getEnumeratorMethod, out MethodInfo addMethod)
static void GetReadOnlyCollectionExceptionMessages(Type type, string message, string param, out string deserializationExceptionMessage)
static bool HandleIfInvalidCollection(Type type, bool tryCreate, bool hasCollectionDataContract, bool createContractWithException, string message, string param, ref DataContract dataContract)
DataContract(DataContractCriticalHelper helper)
static string CollectionTypeDoesNotHaveDefaultCtor
Definition SR.cs:48
static string CollectionTypeCannotHaveDataContract
Definition SR.cs:44
static string CollectionTypeHasMultipleDefinitionsOfInterface
Definition SR.cs:50
static string CollectionTypeDoesNotHaveAddMethod
Definition SR.cs:46
static string CollectionTypeIsNotIEnumerable
Definition SR.cs:52
Definition SR.cs:7

References System.Runtime.Serialization.CollectionDataContract.CollectionDataContract(), System.Collections.Generic.Dictionary< TKey, TValue >.Dictionary(), System.array, System.SR.CollectionTypeCannotBeBuiltIn, System.SR.CollectionTypeCannotHaveDataContract, System.SR.CollectionTypeDoesNotHaveAddMethod, System.SR.CollectionTypeDoesNotHaveDefaultCtor, System.SR.CollectionTypeHasMultipleDefinitionsOfInterface, System.SR.CollectionTypeIsNotIEnumerable, System.Runtime.Serialization.Dictionary, System.Type.EmptyTypes, System.Runtime.Serialization.DataContract.GetBuiltInDataContract(), System.Runtime.Serialization.DataContract.GetClrTypeFullName(), System.Runtime.Serialization.CollectionDataContract.GetCollectionMethods(), System.Type.GetInterfaces(), System.Runtime.Serialization.CollectionDataContract.GetReadOnlyCollectionExceptionMessages(), System.Runtime.Serialization.CollectionDataContract.HandleIfInvalidCollection(), System.Runtime.Serialization.CollectionDataContract.IsArraySegment(), System.Runtime.Serialization.CollectionDataContract.IsCollection(), System.Runtime.Serialization.CollectionDataContract.IsCollectionDataContract(), System.Runtime.Serialization.CollectionDataContract.KnownInterfaces, System.type, System.Runtime.Serialization.Globals.TypeOfDataContractAttribute, System.Runtime.Serialization.Globals.TypeOfICollectionGeneric, System.Runtime.Serialization.Globals.TypeOfIDictionary, System.Runtime.Serialization.Globals.TypeOfIDictionaryGeneric, System.Runtime.Serialization.Globals.TypeOfIEnumerable, System.Runtime.Serialization.Globals.TypeOfIEnumerableGeneric, System.Runtime.Serialization.Globals.TypeOfIList, System.Runtime.Serialization.Globals.TypeOfIListGeneric, System.Runtime.Serialization.Globals.TypeOfIXmlSerializable, System.Runtime.Serialization.Globals.TypeOfKeyValue, System.Runtime.Serialization.Globals.TypeOfKeyValuePair, and System.Runtime.Serialization.Globals.TypeOfObject.

Referenced by System.Runtime.Serialization.CollectionDataContract.CreateGetOnlyCollectionDataContract(), System.Runtime.Serialization.CollectionDataContract.IsCollectionHelper(), System.Runtime.Serialization.CollectionDataContract.TryCreate(), and System.Runtime.Serialization.CollectionDataContract.TryCreateGetOnlyCollectionDataContract().