Bonjour tout le monde !
J'ai actuellement besoin de la méthode ProtocolTypeManager.GetInstance() dans la classe ObjectItem et, j'y comprenais un peu rien donc je suis aller pomper chez BiM (qui, codé en C# m'a paru plus compréhensible)... :oops:
Rappel du principal de la classe ProtocolTypeManager de BiM :
Cliquez pour révéler
Cliquez pour masquer
private static readonly Dictionary<short, Type> m_types = new Dictionary<short, Type>(200);
private static readonly Dictionary<short, Func<object>> m_typesConstructors = new Dictionary<short, Func<object>>(200);
static ProtocolTypeManager()
{
Assembly asm = Assembly.GetAssembly(typeof(ProtocolTypeManager));
foreach (Type type in asm.GetTypes())
{
if (type.Namespace == null || !type.Namespace.StartsWith(typeof(ProtocolTypeManager).Namespace))
continue;
FieldInfo field = type.GetField("Id");
if (field != null)
{
// le cast uint est obligatoire car l'objet n'a pas de type
short id = (short)(field.GetValue(type));
m_types.Add(id, type);
ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);
if (ctor == null)
throw new Exception(string.Format("'{0}' doesn't implemented a parameterless constructor", type));
m_typesConstructors.Add(id, ctor.CreateDelegate<Func<object>>());
}
}
}
public static T GetInstance<T>(short id) where T : class
{
if (!m_types.ContainsKey(id))
{
throw new ProtocolTypeNotFoundException(string.Format("Type <id:{0}> doesn't exist", id));
}
return m_typesConstructors[id]() as T;
}
Là, il se trouve que ça fonctionne pas très bien. Je fais appel à ProtocolTypeManager.GetInstance :
loc_5 = ProtocolTypeManager.GetInstance<ObjectEffect>((short)loc_4);
(A savoir que loc_5 est un ObjectEffect non instancié (j'ai essayé aussi en l'instanciant) qui sera ajouté ensuite à une List<ObjectEffecct>.)
Là, il me retourne un ObjectEffectInteger (comme il faut, étant donné que loc_4 vaut 70 et que protocolId d'ObjectEffectInteger vaut 70) mais il se trouve qu' à la ligne suivante ... :
loc_5.ReadPacket(big_Endian_Reader);
(ReadPacket correspond au deserialize, big_Endian_Reader, au reader, mais il n'y à pas de soucis à ce niveau.)
(Mieux comprendre en image : http://puu.sh/5hjjE.png)
... il n'ira lire que dans ObjectEffect et pas dans ObjectEffectInteger (puis ObjectEffect car il lit la base de ObjectEffectInteger, qui hérite de ObjectEffect, avant de retourner dans ObjectEffectInteger pour finir la lecture). (Mieux comprendre en image : http://puu.sh/5hjno.png et http://puu.sh/5hjoZ.png)
Donc ça me décalle d'un short (censé être lu dans ObjectEffectInteger) et au deuxième tour de la boucle, il lit la valeur normalement de ObjectEffectInteger.value (10), et sauf qu'il cherche l'instance pour 10 (soit LoginQueueMessage), et ça plante.
Personne à des suggestions ?! :S