如何将变量转换为相同类型的动态变量?

时间:2014-06-06 15:25:22

标签: c# .net variables dynamic casting

我目前正在开发一种放大方法,接受PCM样本作为ICollection<dynamic>(调用者只会传递以下任一集合:sbyteshort或{{1} })。我创建的放大算法运行良好;我只是不知道如何将新放大的样本转换回其原始类型,因为放大逻辑将样本输出为int

我知道我可以添加某种List<double>语句来将样本转换回原始类型,但这似乎是一个相当原始的解决方案,有没有更好的方法来实现这一目标?

我如何调用方法(switchsamples续订List<dynamic>int是我为读取wav文件创建的类,

file

我的方法,

AmplifyPCM(samples, file.BitDepth, 0.5f);

1 个答案:

答案 0 :(得分:2)

那么你可以让它成为通用的,它将提供返回类型。但是C#不支持具有泛型的运算符。您可以尝试将它们转换为动态。

static private List<T> AmplifyPCM<T>(ICollection<T> samples, ushort bitDepth, float volumePercent)
{
    var highestSample = 0;
    var temp = new List<T>();

    foreach (var sample in samples)
    {
        if ((dynamic)sample < 0)
        {
            temp.Add(-(dynamic)sample);
        }
        else
        {
            temp.Add(sample);
        }
    }

    foreach (var sample in temp)
    {
        if ((dynamic)sample > highestSample)
        {
            highestSample = (dynamic)sample;
        }
    }

    temp = null;

    var ratio = (volumePercent * (Math.Pow(2, bitDepth) / 2)) / highestSample;
    var newSamples = new List<T>();

    foreach (var sample in samples)
    {
        newSamples.Add((dynamic)(T)sample * ratio);
    }

    return newSamples;
}