使用相同的方法将 1 添加到可以是 float 或 int 的转换字符串

Use same method to add 1 to a casted string that can be either float or int

认为这是一个通用与特定类型的问题。 我想向可以是 intfloat 的字符串转换参数添加一个单位。 我尝试了以下方法,但在转换时出现问题,因为在编译时不知道类型。

namespace ConsoleApp17
{
    class Program
    {
        static int myInt = 1;
        static float myFloat = 2f;

        static void Main(string[] args)
        {
            string myFloatStr = "1.3";
            string myIntStr = "2";
            Add<float>(myFloatStr, SetNewFloatValue);
            Add<int>(myIntStr, SetNewIntValue);

            Console.ReadLine();
        }


        public static void Add<T>(string str, Action<T> action)
        {
            T valueToSet = (T)Math.Round(double.Parse(str) + 1, 0 , MidpointRounding.AwayFromZero); //problem here, cannot convert double to T
            action(valueToSet);
        }

        private static void SetNewFloatValue(float floatArg) {
            myFloat += floatArg;
        }

        private static void SetNewIntValue(int intArg)
        {
            myInt += intArg;
        }

    }

}

fiddle 以防有帮助。 每个参数的方法重载是唯一的解决方案,还是有更优雅的解决方案,以便可以在同一个方法中处理两种类型 floatint 的相同功能?

意思是:

Add<float>(myFloatStr, SetNewFloatValue);
Add<int>(myIntStr, SetNewIntValue);

可以用一种相同的方法完成。

“通用数学”就是您想要的。此功能是 .NET 6.0/C#10 中的预览功能。详细描述 here.

这允许这样的方法声明:

public static TResult Sum<T, TResult>(IEnumerable<T> values)
    where T : INumber<T>
    where TResult : INumber<TResult>
{
    TResult result = TResult.Zero;

    foreach (var value in values)
    {
        result += TResult.Create(value);
    }

    return result;
}

INumber界面是这个概念的神奇所在。它现在已在大多数数字类型上实现。

以前,您必须手动实现(通过指定您自己的 INumber 接口,使用 Add()、Subtract() 等方法)或使用 dynamic 类型来评估正确的在运行时类型。前者为此写了很多样板,后者很慢。

如果您使用的是 .Net 6 之前的版本,您可以使用 Convert.ChangeType

T valueToSet = (T)Convert.ChangeType(Math.Round(double.Parse(str) + 1, 0, MidpointRounding.AwayFromZero), typeof(T));