c# - 在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<> 的东西,但不清楚那是正确的路径,我也没有完全理解。
我的方法也有可能是倒退的,所以如果有任何关于如何改进设计的想法,那也很好。
解决方案
推荐阅读
- scala - 如何为此 Btree 实现实现“查找”方法
- php - 使用 __DIR__ 获取文件位置
- android - 我们如何在 Android 上从 Firebase 实时数据库中对 RecyclerView 进行分页?
- javascript - 当应用程序处于后台时,React Native setInterval 会暂停
- c# - 将 int 和 char 分开并生成整数
- r - 在R中将散点图和折线图与highcharter结合起来
- python - 从 OrderDict 到字典 python
- bash - 在 VSTS 上的 bash 脚本中使用变量组中的变量
- javascript - 使用 Trianglify 作为网站背景?
- javascript - 使用 CodeIgniter 中的复选框生成特定行的 excel 报告