首页 > 解决方案 > 在c#中根据泛型类型T选择委托

问题描述

我有以下情况,我认为这是对代表的完美使用,但是,我是使用代表的新手,并且在使其工作时遇到了一些问题。

我从这段代码中调用 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 值设为委托,但我似乎无法使用 <T> 制作任何委托。然后我可以选择委托并调用该方法,而根本不需要 AddVariable。它们都具有相同的签名(T 除外)并且基本上做相同的事情,但稍作修改。

编辑:预期的伪代码:

AddVariable< int >(表、基准、函数应用值);

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

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

我在网上看到了一些关于使用 Func<> 的东西,但不清楚那是正确的路径,我也没有完全理解。

我的方法也有可能是倒退的,所以如果有任何关于如何改进设计的想法,那也很好。

标签: c#genericsdelegatesswitch-statementfunc

解决方案


推荐阅读