相关疑难解决方法(0)

如何在没有装箱的情况下将通用类型T的值转换为double?

想象一下以下简单的代码:

public void F<T>(IList<T> values) where T : struct
{
  foreach (T value in values)
  {
    double result;
    if (TryConvertToDouble((object)value, out result))
    {
      ConsumeValue(result);
    }
  }
}

public void ConsumeValue(double value)
{
}
Run Code Online (Sandbox Code Playgroud)

上面代码的问题是转换为对象,这导致在循环中装箱.

有没有办法实现相同的功能,即为ConsumeValue提供所有值而不需要在foreach循环中使用装箱?注意,F必须是通用方法.

只要在循环外执行一次,我就可以使用昂贵的准备代码.例如,如果需要发出一个奇特的动态方法,那么只做一次就可以了.

编辑

T保证是某种数字类型或bool.

动机.想象一下元数据驱动的应用程序,其中代理报告数据流,其中数据项类型是基于数据流元数据动态发出的.想象一下,还有规范化引擎,它知道根据某种算法规范化数字数据流.传入的数字数据流的类型仅在运行时是已知的,并且可以指向该数据类型的通用方法.然而,规范化器期望双倍并产生双精度.这是一个非常高级别的描述,请不要深入研究.

EDIT2

关于演员要加倍.实际上我们有一个方法,使用以下签名转换为double:

bool TryConvertToDouble(object value, out double result);
Run Code Online (Sandbox Code Playgroud)

我应该首先在示例中使用它,但我想节省空间并编写一些不起作用的东西.现在修好了.谢谢你的注意.

EDIT3

伙计们,目前的实施确实包装了价值观.即使我没有关于它的性能惩罚的探查者的判断(如果有的话),我仍然有兴趣知道是否有没有装箱的解决方案(并且没有转换为字符串).让我称之为纯粹的学术兴趣.这真的让我感兴趣,因为在C++中使用模板这样的东西是微不足道的,但是,当然,我还没有开始关于什么是更好的.NET泛型或C++模板的另一个愚蠢和毫无意义的论点.请忽略这最后一句话.

EDIT4

感谢/sf/users/18721/提供了答案.实际上,我已经使用他的代码示例编写了一个这样的简单类:

public static class Utils<T>
{
  private static class ToDoubleConverterHolder
  {
    internal static Func<T, double> Value = EmitConverter();

    private static Func<T, double> EmitConverter()
    {
      ThrowIfNotConvertableToDouble(typeof(T));

      var method …
Run Code Online (Sandbox Code Playgroud)

.net

15
推荐指数
2
解决办法
7987
查看次数

标签 统计

.net ×1