c# - 实现泛型类的集合

标签 c# generics collections

我正在尝试创建一个如下所示的自定义类。

public MyClass<T> 
{
    public string Value1 { get; set; }
    public T Value2 { get; set; }
    public string Value3 { get; set; }
}

T 的值可以是字符串、整数或日期时间。我假设我可以创建此类的新实例,例如

MyClass<int> intclass = new MyClass<int>();
MyClass<String> stringclass=new MyClass<String>();

等等。

是否可以创建上述类的集合,我可以将 intclass 和 stringclass 放入自定义集合中。

最佳答案

如果您想混合不同的泛型类型(因此拥有一个同时包含 MyClass<int>MyClass<string> 的集合),您需要定义一些通用的基本类型使用非强类型的集合:

public class MyClass<T> : MyClass
{
    public T Value2 { get; set; }
}

public class MyClass
{
    public string Value1 { get; set; }
    public string Value3 { get; set; }
}

然后你可以定义一个集合,例如:

List<MyClass> list = new List<MyClass>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());

在检索条目时,您必须转换结果才能访问其 Value2不过属性(property)。

避免基类的另一个选择是简单地使用 List<object> :

List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());

但这与上面的问题相同,但似乎更糟糕(因为这样你就可以在其中存储任何东西)

编辑:有多种方法可以允许对Value2进行非类型化访问。在非通用基础 MyClass 。一种方法是在基类上定义它的“无类型”版本,并在执行类型检查的子类上重写它:

public abstract class MyClass
{
    public string Value1 { get; set; }
    public abstract object Value2Untyped { get; set; }
    public string Value3 { get; set; }
}

public class MyClass<T> : MyClass
{
    public T Value2 { get; set; }

    public override object Value2Untyped
    {
        get
        {
            return Value2;
        }
        set
        {
            Value2 = (T)value;
        }
    }
}

然后对于根据基本非泛型 MyClass 输入的所有对象或集合,您仍然可以访问值,甚至可以在运行时设置值。 (set当然是可选的)

关于c# - 实现泛型类的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16085990/

相关文章:

c# - Iron Python 如何与 C# 类一起玩(普通或漂亮)?

c# - 从 List<T> 获取项目并更新该项目的属性

c# - 如何将 List<object> 转换为 List<Something Else>

c# - visual studio中tab的逆向效果

c# - 文档管理系统-架构设计问题

java - 如何制作一个可以接受两种不同的、不相关的类型的通用列表?

Java:泛型类型类型不匹配语法错误

VBA:将类项添加到类内的集合中

java - Collection的reverseOrder方法的时间复杂度

c# - 如何从 SortedDictionary 中获取最接近我的键的项目?