如何使泛型类成为另一个实例类中的属性

本文关键字:属性 实例 另一个 何使 泛型类 | 更新日期: 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是值类型,所以它们不能在当前表单中使用