使用相同的方法将 1 添加到可以是 float 或 int 的转换字符串
Use same method to add 1 to a casted string that can be either float or int
认为这是一个通用与特定类型的问题。
我想向可以是 int
或 float
的字符串转换参数添加一个单位。
我尝试了以下方法,但在转换时出现问题,因为在编译时不知道类型。
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 以防有帮助。
每个参数的方法重载是唯一的解决方案,还是有更优雅的解决方案,以便可以在同一个方法中处理两种类型 float
和 int
的相同功能?
意思是:
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));
认为这是一个通用与特定类型的问题。
我想向可以是 int
或 float
的字符串转换参数添加一个单位。
我尝试了以下方法,但在转换时出现问题,因为在编译时不知道类型。
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 以防有帮助。
每个参数的方法重载是唯一的解决方案,还是有更优雅的解决方案,以便可以在同一个方法中处理两种类型 float
和 int
的相同功能?
意思是:
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));