Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在C中相同基类型的多个列表上使用泛型getter/setter方法吗_C#_List_Class_Generics_Member - Fatal编程技术网

C# 我可以在C中相同基类型的多个列表上使用泛型getter/setter方法吗

C# 我可以在C中相同基类型的多个列表上使用泛型getter/setter方法吗,c#,list,class,generics,member,C#,List,Class,Generics,Member,我想知道是否有一种方法可以为下面的代码创建通用的getter和setter方法 当前,setter检查输入对象的实际类型并将其添加到相关列表中。这对我来说是一个糟糕的方法,但我想知道是否有更好的方法 我不能使用任何其他数据结构,比如字典,因为我使用的是一个序列化系统,它只能序列化简单的集合类型,比如列表和数组,因此可以序列化所有的单个列表 public abstract class BaseStyleType {} public class ImageStyle : BaseStyleType

我想知道是否有一种方法可以为下面的代码创建通用的getter和setter方法

当前,setter检查输入对象的实际类型并将其添加到相关列表中。这对我来说是一个糟糕的方法,但我想知道是否有更好的方法

我不能使用任何其他数据结构,比如字典,因为我使用的是一个序列化系统,它只能序列化简单的集合类型,比如列表和数组,因此可以序列化所有的单个列表

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)
    {
        //...?
    }
}

谢谢

我至少看到两种方法:

你有一个简单、平淡的家庭。仅列出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每次需要一个类型字段类型、返回类型、参数等。。从两个通用占位符开始,通常最好创建一个类型别名

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

仅仅因为您不能将事物用于序列化目的,不应该阻止您实际使用它们

以下解决方案的优点是可以无限地从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);
       }
   }
}

难道你不能停止使用过时的序列化系统,甚至不能使用字典吗?我的意思是,你到底在使用什么,它如此糟糕?可能的重复我不认为这会编译,你没有办法把你的泛型约束绑定到你的BaseStyleType实现上,因此,您的列表将拒绝显式强制转换对象,因为它们无法转换。@JonathonChase:我不知道该代码中有任何显式强制转换。我只是说了一些类似的话,承认它不是正确可行的代码。