Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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#_Generics_Collections - Fatal编程技术网

C# 实现泛型类的集合

C# 实现泛型类的集合,c#,generics,collections,C#,Generics,Collections,我正试图创建一个如下所示的自定义类 public MyClass<T> { public string Value1 { get; set; } public T Value2 { get; set; } public string Value3 { get; set; } } 公共MyClass { 公共字符串值1{get;set;} 公共T值2{get;set;} 公共字符串值3{get;set;} } T的值可以是string、int或dateti

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

public MyClass<T> 
{
    public string Value1 { get; set; }
    public T Value2 { get; set; }
    public string Value3 { get; set; }
}
公共MyClass
{
公共字符串值1{get;set;}
公共T值2{get;set;}
公共字符串值3{get;set;}
}
T的值可以是string、int或datetime

MyClass<int> intclass = new MyClass<int>();
MyClass<String> stringclass=new MyClass<String>();
MyClass intclass=newmyclass();
MyClass stringclass=新的MyClass();
等等


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

您的意思是这样的

List<MyClass<int>> intClassList = new List<MyClass<int>>();
intClassList.Add(new MyClass<int>());
List intClassList=newlist();
添加(新的MyClass());

如果要混合不同的泛型类型(因此有一个同时包含
MyClass
MyClass
)的集合,则需要定义一些常见的基类型或使用非强类型的集合:

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

public class MyClass
{
    public string Value1 { get; set; }
    public string Value3 { get; set; }
}
但问题与上面的相同,但似乎更糟(因为这样你就可以在那里存储任何东西)

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

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
{
公共字符串值1{get;set;}
公共抽象对象值2非类型化{get;set;}
公共字符串值3{get;set;}
}
公共类MyClass:MyClass
{
公共T值2{get;set;}
公共重写对象值2未类型化
{
得到
{
返回值2;
}
设置
{
Value2=(T)值;
}
}
}

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

否。您的示例只会有一个基类型MyClass的集合…其中T是int。我希望我的自定义集合有一个基类型T,其中T可以是int/string/datetime。我不知道这是否可行,因为我看到了类型安全的问题。您明白吗,如果您想将它们放在一个集合中,您需要从对象中强制转换
int
string
?可能重复/相关:感谢大家的快速回答。。。!!
List<object> list = new List<object>();
list.Add(new MyClass<int>());
list.Add(new MyClass<string>());
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;
        }
    }
}