提问人:justSomeUser4 提问时间:11/11/2022 最后编辑:T.S.justSomeUser4 更新时间:11/15/2022 访问量:112
投射到任何类型
Cast to any type
问:
我有一个txt文件,我可以从中提取两个字符串(类型和值)。但是,我需要将其转换为正确的类型。请参阅下面的代码。
string type;
string value;
//example 1 //from the txt file
type = "int";
value = "25";
//example 2
type = "double";
value = "1.3";
//example 3
type = "string";
value = "blablabla";
//conversion I would like to do:
dynamic finalResult = (type)element.Value; //this returns an error
我需要做这样的事情,但我不知道从字符串的内容创建对象类型。
我试图声明一个类型:
Type myType = type;
但我不知道如何正确地做到这一点。
答:
2赞
big boy
11/11/2022
#1
这行得通吗?
object result;
string value = "some value";
string type = "some type";
switch(type)
{
case "int":
result = Convert.ToInt32(value);
break;
case "double":
result = Convert.ToDouble(value);
break;
case "string":
result = value;
break;
// case "any other datatype":
// result = convert explicitly to that datatype
}
评论
1赞
T.S.
11/11/2022
dynamic
不需要
0赞
big boy
11/11/2022
@T.S.那应该怎么做呢?
2赞
T.S.
11/11/2022
dynamic
这里用于后期绑定操作、未知结构等 - 使用 .object
3赞
Narish
11/11/2022
#2
为了清晰和类型安全,我认为您应该只使用开关表达式和各种方法的组合,让它返回泛型类型.TryParse()
static T? ReadVariable<T>(string type, string value) =>
type switch
{
"int" => int.TryParse(value, out int val) ? val : null, //null or throw an ex
"double" => double.TryParse(value, out double val) ? val : null,
"string" => string.TryParse(value, out string val) ? val : null,
"bool" => bool.TryParse(value, out bool val) ? val : null,
//... etc
_ => throw new NotSupportedException("This type is currently not supported")
};
int? num = ReadVariable<int>("int", "99"); //nullable return
//nullable handling
int num = ReadVariable<int>("int", "99") ?? default(int); //int type's default value is 0
int num = ReadVariable<int>("int", "99").GetValueOrDefault(-1); //default to an int value of your choice
你真的会遇到需要在阳光下解析任何类型的情况吗?此方法允许您保持对所发生情况的完全控制。使用可能比您预期的更令人头疼dynamic
更新:感谢 @ckuri 指出您可能还希望使用允许固定区域性的 try parse 重载来考虑国际编号方案
更新 2:添加了可为 null 的处理示例
评论
1赞
ckuri
11/11/2022
TryParse 方法应使用采用 CultureInfo 的重载,并用 填充 .否则,如果不使用句点作为小数分隔符的机器上运行,它将中断。CultureInfo.InvariantCulture
0赞
Narish
11/11/2022
@ckuri这是一个很好的观点,谢谢,将链接该文档
评论
"int"
typeof(int)