gpt4 book ai didi

c# - 来自字符串的通用泛型类型转换

转载 作者:行者123 更新时间:2023-11-30 14:33:21 25 4
gpt4 key购买 nike

我的任务是编写一个 StringToType() 方法,将字符串转换为指定类型 T。

  1. 对于原始类型,我使用 Convert.ChangeType() 方法
  2. 对于枚举类型 - Enum.TryParse()
  3. 对于所有其他自定义类型,我创建了一个接口(interface)“IConvertibleFromString”,其中包含一个方法“FromString()”以将字符串转换为指定类型。任何需要从字符串转换的类都必须实现此接口(interface)。

但我不喜欢我实现方法 StringToType() 的方式。我想少用反射,尽可能保证性能。

请建议如何最好地实现/更改它。

class Program
{
static bool StringToType<T>(string str, ref T value)
{
Type typeT = typeof(T);
bool isSuccess = false;
if (typeT.GetInterface("IConvertibleFromString") != null)
{
return (bool)typeT.GetMethod("FromString").Invoke(value, new object[] { str });
}
else if (typeT.IsEnum)
{
MethodInfo methodTryParse = typeT.GetMethod("TryParse").MakeGenericMethod(typeT);
return (bool)methodTryParse.Invoke(null, new object[] { str, value });
}
else if (typeT.IsPrimitive)
{
value = (T)Convert.ChangeType(str, typeT);
return true;
}
return isSuccess;
}

static void Main(string[] args)
{
string intStr = "23";
int val1 = 0;
bool res = StringToType<int>(intStr, ref val1);
Class1 c1;
res = StringToType<Class1>(intStr, ref c1);
Console.ReadKey();
}
}

interface IConvertibleFromString
{
bool FromString(string str);
}

class MySomeClass : IConvertibleFromString
{
int someVal;

public bool FromString(string str)
{
return int.TryParse(str, out someVal);
}
}

最佳答案

这似乎对我来说表现最好。与不同的消费者一起进行了一百万次迭代。它结合了人们的评论,还有一些额外的内容。

    static Boolean TryParseString<T>(
String stringValue, ref T value)
{

Type typeT = typeof(T);

if (typeT.IsPrimitive)
{
value = (T)Convert.ChangeType(stringValue, typeT);
return true;
}
else if (typeT.IsEnum)
{
value = (T)System.Enum.Parse(typeT, stringValue); // Yeah, we're making an assumption
return true;
}
else
{
var convertible = value as IConvertible;
if (convertible != null)
{
return convertible.FromString(stringValue);
}
}

return false;

}

关于c# - 来自字符串的通用泛型类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16653669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com