gpt4 book ai didi

c# - 实现泛型类的集合

转载 作者:行者123 更新时间:2023-12-02 22:05:59 25 4
gpt4 key购买 nike

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

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

T 的值可以是 string 或 int 或 datetime。我假设我可以像这样创建此类的新实例

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com