Выберите делегата на основе универсального типа T в c # - PullRequest
0 голосов
/ 31 января 2019

У меня следующая ситуация, которая, по моему мнению, идеально подходит для использования делегатов, однако я новичок в использовании делегатов и у меня возникают некоторые проблемы с его настройкой.

Я вызываю метод AddVariable изэтот код, который определяет соответствующее значение для T.

switch (datum.DataType) {
            case SupportedDataTypes.Int:
                table = AddVariable<int>(table, datum);
                break;
            case SupportedDataTypes.Float:
                table = AddVariable<float>(table, datum);
                break;
            case SupportedDataTypes.String:
                table = AddVariable<string>(table, datum);
                break;
            case SupportedDataTypes.ChooseType:
                throw new ArgumentException("type not chosen");
            default:
                throw new ArgumentOutOfRangeException();
        }

Но AddVariable просто выбирает соответствующий метод на основе другого переключателя.Эти методы должны быть универсальными, так как они действуют на несколько разных типов.

static DataTable AddVariable<T>(DataTable table, Datum datum) {

    DataTable newTable = table.Clone();
    AddVariableColumn(datum, newTable);

    switch (datum.MixingTypeOfVariable) {
        case VariableMixingType.Balanced:
            table = AddBalancedValues<T>(table, datum);
            break;
        case VariableMixingType.Looped:
            table = AddLoopedValues<T>(table, datum);
            break;
        case VariableMixingType.EvenProbability:
            table = AddEvenProbabilityValues<T>(table, datum);
            break;
        case VariableMixingType.CustomProbability:
            throw new NotImplementedException();
        default:
            throw new ArgumentOutOfRangeException();
    }

    Debug.Log($"table now has {table.Rows.Count} rows");
    return newTable;
}

Я думал о том, чтобы сделать значения AddLooped, AddBalanced и AddEvenProbability делегатами, но я не могу создать делегаты с .Тогда я мог бы выбрать делегата и вызвать этот метод без необходимости AddVariable.Все они имеют одинаковую подпись (за исключением T) и в основном делают одно и то же, но слегка модифицированы.

Редактировать: ожидается псевдокод:

AddVariable (table, datum, функция для применения значений );

Обратите внимание, что функция для применения значений должна знать, что она также является .Так как это также общее.

Я нашел в Интернете некоторые дискуссии об использовании общих делегатов, но, похоже, все они имеют какое-то отношение к стеку.Это не похоже на то, что я хочу.

Я видел некоторые вещи в Интернете об использовании Func <>, но не было ясно, что это правильный путь, и я не совсем понял его.

Также возможно, что мой подход задом наперед, поэтому, если есть какие-либо идеи о том, как улучшить дизайн, это было бы также замечательно.

...