如何使泛型类成为另一个实例类中的属性
本文关键字:属性 实例 另一个 何使 泛型类 | 更新日期: 2023-09-27 18:26:39
我对C#泛型完全陌生,所以我有以下问题。我有两节课。一个基于实例的类和另一个泛型类。我想在第二个泛型类的类型的第一个类中有一个属性。
这些线上的东西。。。。功能方面。
public class SampleClass
{
private SampleGenericClass<T> sampleClass;
public SampleClass(string name, int age, string version)
{
if(version == "1.0")
{
this.sampleClass = new SampleGenericClass<int>(name, age);
}
else
{
this.sampleClass = new SampleGenericClass<long>(name.age);
}
}
public void Load()
{
this.sampleClass.Load();
}
public void Open()
{
this.sampleClass.Open();
}
public void Close()
{
this.sampleClass.Close();
}
}
我的第二个普通类是这样的
internal class SampleGenericClass<T> where T : class
{
private string name;
private string age;
public SampleGenericClass(string name, int age)
{
this.name = name;
this.age = age;
}
public void Load()
{
// Do something based on type
if(typeof(T) == typeof(int))
{
// load int type
}
else if(typeof(T) == typeof (long))
{
// load long type
}
else
{
throw new ArgumentException("Un supported type");
}
}
public void Open()
{
// Do something based on type
if(typeof(T) == typeof(int))
{
// open int type
}
else if(typeof(T) == typeof (long))
{
// open long type
}
else
{
throw new ArgumentException("Un supported type");
}
}
public void Close()
{
// Do something based on type
if(typeof(T) == typeof(int))
{
// close int type
}
else if(typeof(T) == typeof (long))
{
// close long type
}
else
{
throw new ArgumentException("Un supported type");
}
}
}
现在我明白CLR不支持泛型属性或构造函数。那么我该如何解决这个问题呢?我仍然希望有一个泛型类,并根据传递给第一类构造函数的params,在我的第二类中以某种方式实例化它,以便在第二类调用方法load、openm和close。
谢谢你的帮助。
注意:我知道上面的代码不能编译,bcoz CLR不支持泛型属性和构造函数。这只是为了说明我想在概念上实现什么
IMO您应该在上层决定SampleClass的类型。事实上,您应该将其定义为泛型:
public class SampleClass<T> where T : ....
{
private SampleGenericClass<T> sampleClass;
public SampleClass(string name, int age, string version)
{
this.sampleClass = new SampleGenericClass<T>(name, age);
}
public void Load()
{
this.sampleClass.Load();
}
}
并基于更高级别的版本(以及相关的泛型)创建SampleClass。
例如:
主要方法:
if (version == "1")
{
DoAction<int>();
}
else
DoAction<long>();
.....
void DoAction<T>()
{
SampleClass<T> s = new SampleClass<T>(...)
}
正如我所看到的,您的成员变量不需要t类型,所以您可以在函数调用中将其移动到较低级别。
要么声明一个具体类型
public class SampleClass {
private SampleGenericClass<int> sampleClass;
...
}
或者向SampleClass
添加通用类型参数
public class SampleClass<T> where T : class {
private SampleGenericClass<T> sampleClass;
...
}
接口:
public interface ISampleGenericClass
{
void Load();
void Open();
void Close();
}
泛型类实现了这一点:
internal class SampleGenericClass<T> : ISampleGenericClass
{
...
}
和SampleClass
public class SampleClass
{
private ISampleGenericClass sampleClass;
....
}
我删除了类约束,因为int和long是值类型,所以它们不能在当前表单中使用