Привести класс generi c к другому типу - PullRequest
2 голосов
/ 17 июня 2020

ПРИМЕЧАНИЕ : я собираюсь упростить структуру и содержимое класса, на самом деле он намного сложнее, но остальная часть не является необходимой для рассматриваемой проблемы.

У меня следующая (упрощенная) структура классов:

public abstract class Config
{
    // A number of abstract parameters and special abstract methods
}

public class GenericConfig<T> : Config
{
    private DataType configDataType;
    public DataType ConfigDataType
    {
        get { /* A get function */ }
        set { /* A set function */ }
    }
    public T InitialValue { get; set; }
    public T MinValue { get; set; }
    public T MaxValue { get; set; }
    // Overridden parameters and methods
}

public enum DataType
{
    Int,
    Bool,
    Float,
    String,
    DateTime
}

Когда я создаю экземпляр объекта Config, он выглядит так:

Config configInstance = new GenericConfig<int>(..., ConfigDataType=0, ...)

Что я хотел бы сделать, так это привести тип int к float или что-то еще из вызова метода. Что-то вроде следующего (я бы предпочел следовать своим типам перечислений):

configInstance.CastType("Float") OR configInstance.CastType(2), что даст мне эквивалент:

Config configInstance = new GenericConfig<float>(..., ConfigDataType=2, ...)

Возможно ли это хотя бы отдаленно или этого следует избегать?

1 Ответ

1 голос
/ 17 июня 2020

Я думаю, вы можете подумать о том, чтобы переосмыслить или улучшить свой дизайн (почему необходимо ConfigDataType), но вы можете использовать явное приведение оператора следующим образом:

static public explicit operator GenericConfig<int>(GenericConfig<T> value)
{
  if ( typeof(T) is int ) return (GenericConfig<int>)value;
  return null;
}

static public explicit operator GenericConfig<float>(GenericConfig<T> value)
{
  if ( typeof(T) is float ) return (GenericConfig<float>)value;
  return null;
}

Создайте новый экземпляр и обработайте преобразование с помощью копировать вместо возврата null.

Использование:

Config v1 = new GenericConfig<int>();
Config v2 = (GenericConfig<float>)v1;
...