Как сделать универсальный класс свойством в другом экземпляре класса? - PullRequest
1 голос
/ 04 марта 2012

Я совершенно новичок в C # generic, поэтому у меня следующая проблема. У меня есть 2 класса. Один экземпляр основан и другой универсальный класс. Я хочу иметь свойство в 1-м классе типа 2-го универсального класса.

что-то в этих строках .... функциональность мудрая.

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 не поддерживает общие свойства или конструкторы. Так как я могу решить эту проблему? Я все еще хочу иметь универсальный класс и каким-то образом создать его экземпляр во втором классе на основе параметров, передаваемых конструктору 1-го класса, чтобы вызывать методы load, openm, close во 2-м классе.

Спасибо за вашу помощь.

ПРИМЕЧАНИЕ. Я знаю, что приведенный выше код не компилируется, bcoz CLR не поддерживает универсальные свойства и конструкторы. Это просто для иллюстрации того, чего я хочу достичь концептуально

Ответы [ 3 ]

2 голосов
/ 04 марта 2012

Либо объявить конкретный тип

public class SampleClass {   
    private SampleGenericClass<int> sampleClass; 
    ...
}

или добавьте параметр общего типа в SampleClass

public class SampleClass<T> where T : class {   
    private SampleGenericClass<T> sampleClass; 
    ...
}
2 голосов
/ 04 марта 2012

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 для переменных-членов, поэтому вы можете переместить его внижний уровень в вызовах функций.

1 голос
/ 04 марта 2012

Интерфейс:

 public interface ISampleGenericClass
  {
        void Load();
        void Open();
        void Close();
  }

Универсальный класс реализует это:

internal class SampleGenericClass<T> : ISampleGenericClass
{
   ...
}

И SampleClass

public class SampleClass
{
  private ISampleGenericClass sampleClass;
....
}

Я снял ограничение класса, поскольку int и long являются типами значений, поэтому их нельзя использовать в текущей форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...