Могу ли я использовать общие методы получения / установки в нескольких списках одинаковых базовых типов в C # - PullRequest
0 голосов
/ 25 октября 2018

Я хочу знать, есть ли способ создать общие методы получения и установки для приведенного ниже кода.

В настоящее время установщик проверяет фактический тип входного объекта и добавляет его в соответствующий список.Мне кажется, что это плохой подход, но я хотел бы знать, есть ли лучший способ.

Я не могу использовать другие структуры данных, такие как словарь, потому что я использую систему сериализации, которая можеттолько сериализуют простые типы коллекций, такие как списки и массивы, следовательно, все отдельные списки.

public abstract class BaseStyleType {}
public class ImageStyle  : BaseStyleType {}
public class TextStyle   : BaseStyleType {}
public class ButtonStyle : BaseStyleType {}
//...etc

public class GlobalStyle : ASerializedObject
{
    public List<ImageStyle>  ImageStyles     = new List<ImageStyle>();
    public List<TextStyle>   TextStyles      = new List<TextStyle>();
    public List<ButtonStyle> ButtonStyles    = new List<ButtonStyle>();
    //... etc

    // Setter
    public void SetStyle(BaseStyleType inStyle)
    { 
        if (inStyle as ImageStyle != null)
            ImageStyles.Add((ImageStyle)inStyle);
        else if (inStyle as TextStyle != null)
            TextStyles.Add((TextStyle)inStyle);
        else if (inStyle as ButtonStyle != null)
            ButtonStyles.Add((ButtonStyle)inStyle);
        //... etc
    }

    // Getter
    public T GetStyle<T>(int index)
    {
        //...?
    }
}

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

То, что вы не можете использовать вещи для целей сериализации, не должно мешать вам использовать их на самом деле.

Преимущество следующего решения состоит в том, что вы можете бесконечно создавать производные классы из BaseStyleType (или других супертипов).) и вам нужно только создать свойства для доступа к словарю.

public abstract class BaseStyleType {}
public class ImageStyle  : BaseStyleType {}
public class TextStyle   : BaseStyleType {}
public class ButtonStyle : BaseStyleType {}

// NOT THREAD SAFE
public class GlobalStyle
{
   // 
   private Dictionary<Type,List<BaseStyleType>> _lists = 
     new Dictionary<Type,List<BaseStyleType>>();

   // Not sure why you'd use Fields here...
   public IEnumerable<ImageStyle> ImageStyles
   {
     get 
     {
       IEnumerable<ImageStyle> result = null;
       List<BaseStyleType> list;
       if (_lists.TryGetValue(typeof(ImageStyle), out list))
       {
         result = list.Cast<ImageStyle>();
       }
       return result;
     }
   }
   //etc
   //public List<ImageStyle>  ImageStyles     = new List<ImageStyle>();
   //public List<TextStyle>   TextStyles      = new List<TextStyle>();
   //public List<ButtonStyle> ButtonStyles    = new List<ButtonStyle>();


   // Setter
   public void SetStyle<T>(T inStyle)
       where T : BaseStyleType
   {
       List<BaseStyleType> list;
       if (_lists.TryGetValue(typeof(T), out list))
       {
         list.Add(inStyle);
       }
       else
       {
           list = new List<BaseStyleType>();
           list.Add(inStyle);
           _lists.Add(typeof(T), list);
       }
   }
}
0 голосов
/ 25 октября 2018

Я вижу по крайней мере два пути:

1) У вас простая, плоская иерархия.Составляйте только списки BaseStyleType.Пусть ковариация и автоматическое вещание позаботятся о деталях.

2) Измените ваш код примерно так:

public abstract class BaseStyleType {}
public class ImageStyle  : BaseStyleType {}
public class TextStyle   : BaseStyleType {}
public class ButtonStyle : BaseStyleType {}
//...etc

public class GlobalStyle <List1Type, List2Type, List3Type, ... > : ASerializedObject
{
    public List<List1Type>  ImageStyles     = new List<List1Type>();
    public List<List2Type>   TextStyles      = new List<List2Type>();
    public List<List3Type> ButtonStyles    = new List<List3Type>();
    //... etc

    // Setter
    public void SetStyle(BaseStyleType inStyle)
    { 
        if (inStyle as ImageStyle != null)
            ImageStyles.Add((ImageStyle)inStyle);
        else if (inStyle as TextStyle != null)
            TextStyles.Add((TextStyle)inStyle);
        else if (inStyle as ButtonStyle != null)
            ButtonStyles.Add((ButtonStyle)inStyle);
        //... etc
    }

    // Getter
    public T GetStyle<T>(int index)
    {
        //...?
    }
}

Проблема с длинными списками типов заключается в том, что вам приходится использовать строкинапример, GlobalStyle <ImageStyle , TextStyle, ButtonStyle> каждые один раз, когда требуется тип (типы полей, типы возвращаемых данных, параметры и т. д.).Начиная с двух общих заполнителей, обычно рекомендуется создать псевдоним типа.

using CustomGlobalStyle = GlobalStyle <ImageStyle, TextStyle, ButtonStyle>;
...