C# 我可以在C中相同基类型的多个列表上使用泛型getter/setter方法吗
我想知道是否有一种方法可以为下面的代码创建通用的getter和setter方法 当前,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
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:我不知道该代码中有任何显式强制转换。我只是说了一些类似的话,承认它不是正确可行的代码。