Diccionario de lista dinámica c#

publicado por: Anonymous

Antes de nada estoy programando para Unity3D, este por ejemplo no permite implementar tipos dinámico (dynamic)

Estoy intentando hacer un diccionario que alberga un string y una lista ( que está; quiero que sea dinámica ).

Todo va bien hasta que intento coger la lista de un determinado índice del diccionario; pero no puedo implementar el RemoveAll del método List.

Objeto ItemWeapons

[Serializable]
public struct ItemWeapons  
{
    public int              id;
    public CommonItem       data;

    public int durability;
    public int degradationByUse;
    public int damageToEntities;
    public int damageToElements;
    public int stamina;
}

Objeto ItemTools

[Serializable]
public struct ItemTools  
{
    public int              id;
    public CommonItem       data;

    public int durability;
    public int degradationByUse;
    public int damageToEntities;
    public int damageToElements;
    public int stamina;
}

Script

public class ItemDataBase : ScriptableObject
{
    public List<ItemTools> itemTools;
    public List<ItemWeapons> itemWeapons;

    public void DinamicList(){

     dic = new Dictionary<string, object> (); // [ POSIBLE ERROR AL DEFINIR OBJECT ]

    dic.Add ("ItemTools",   itemTools);     // Variable "itemTools" es de tipo List<ItemTools>
    dic.Add ("ItemWeapons", itemWeapons);   // Variable "itemWeapons" es de tipo List<ItemWeapons>


}}

Método Eliminar [ POSIBLE FUTURA SOLUCIÓN ]

public bool Remove<T>(T data, string typeItem, int id)
    {
        var d = dic [typeItem] as List<T>;

        if (d != null)
            d.RemoveAll (x => x.id == id); 
    }

Algun consejo o recomendación ?

Gracias.

solución

No vas a poder tener un List<T> que soporte a ambos tipos de clases si estos no tienen un ancestro en común. En ese caso te recomiendo que crees una interfaz con las propiedades comunes a todas los structs que vayas a meter a la lista y que hagas que esos structs implementen la interfaz

public interface IItem
{
    int id { get; set; }
}

[Serializable]
public struct ItemTools: IItem
{
    public int id { get; set; }
    public CommonItem data;

    public int durability;
    public int degradationByUse;
    public int damageToEntities;
    public int damageToElements;
    public int stamina;
}

[Serializable]
public struct ItemWeapons : IItem
{
    public int id { get; set; }
    public CommonItem data;

    public int durability;
    public int degradationByUse;
    public int damageToEntities;
    public int damageToElements;
    public int stamina;
}

De esta manera tu método DinamicList podría quedar de esta manera

public void DinamicList()
{
    dic = new Dictionary<string, List<IItem>>(); // la lista de tipo IItem por lo que todas los structs que la implementen funcionaran

    dic.Add("ItemTools", itemTools);
    dic.Add("ItemWeapons", itemWeapons);

    var d = dic["ItemTools"];

    d.RemoveAll(x => x.id == id); // Puedes usar el campo id porque esta definido en IItem
}

Ten en cuenta que para que esto funcione los campos de IItem deben ser properties, no fields, por lo que he hecho ese cambio en ItemTools y ItemWeapons

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *