根据C#中的通用类型T选择委托

时间:2019-01-31 16:08:31

标签: c# generics delegates switch-statement func

我有以下情况,我认为这是对委托人的完美使用,但是,我对使用委托人并不陌生,并且在使其正常工作方面存在一些问题。

我从这段代码中调用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 (表格,基准面,应用值的函数);

请注意,要应用值的函数也需要知道它的。因为它也是通用的

我在网上找到了一些有关使用泛型委托的讨论,但它们似乎都与Stack有关。听起来不像我想要的。

我在网上看到了一些有关使用Func <>的东西,但是目前尚不清楚这是正确的方法,而且我并不完全理解。

我的方法也有可能倒退,因此,如果对改进设计有任何想法,那也很好。

0 个答案:

没有答案