投射到任何类型

Cast to any type

提问人:justSomeUser4 提问时间:11/11/2022 最后编辑:T.S.justSomeUser4 更新时间:11/15/2022 访问量:112

问:

我有一个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;

但我不知道如何正确地做到这一点。

C# .NET 类型 转换

评论

0赞 Mathias R. Jessen 11/11/2022
这回答了你的问题吗?C#:动态运行时强制转换
0赞 pm100 11/11/2022
另外,您需要调用 Type.GetType,以从其名称中获取类型
0赞 PMF 11/11/2022
你的问题非常令人困惑。 是一个字符串。 是一种类型。你在这里根本不需要动态。"int"typeof(int)
0赞 AliSalehi 11/11/2022
你到底想实现什么?你为什么要这样做?
0赞 justSomeUser4 11/11/2022
txt 文件有一大行。每行都有这两个信息(类型和值)。有时值为 1,但类型为 double。其他时候,值为 3,但类型为 string。我需要将这些具有正确类型发送到方法。正确的类型写在 txt 文件中。

答:

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这是一个很好的观点,谢谢,将链接该文档