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