【问题标题】:How to transforme Type to be a Int, float, bool or char struct in C#?如何在 C# 中将 Type 转换为 Int、float、bool 或 char 结构?
【发布时间】:2022-08-13 23:02:41
【问题描述】:

我正在用java实现一个代码生成器,它将创建一个C#代码。 当我需要使用 Console.ReadLine() 时,变量有一个类型,但在生成代码时我不知道类型。

那么,是否可以仅使用变量从 Console.ReadLine() 转换类型?

代码示例:

public static void main()
{
   var a = 1;
   var b = 2;

   /* The variable \'a\' has a value and is of type integer, 
    * but when I generate this code I don\'t have this information */

   a = Console.ReadLine();


   /*I\'ve tried to get type of variable but I didn\'t get success */
   var type = a.GetType();

   a = type.Parse(Console.ReadLine());
}
  • Convert.ChangeType(Console.ReadLine(), type); docs.microsoft.com/en-us/dotnet/api/… |注意:方法的返回类型是对象,如果对象不够好,需要将其转换为所需的类型
  • @RandRandom 我已经尝试过这个技巧但没有成功:(
  • 需要更多信息来进一步帮助您。
  • 将其作为字符串读取。然后使用int.TryParse 查看是否为int。失败,尝试double.TryParse,失败,检查它是true还是false,然后检查它是否是单个字符。这将告诉您类型(并且,对于 TryParse 调用,给您值)。一个你有类型,做一个正常的解析或转换

标签: c# types code-generation codegen


【解决方案1】:

由于您已将值 1 分配给 var a,因此它是整数类型。现在,在从控制台读取值时,您必须将其转换为 int。

public static void main()
{
   var a = 1;
   var b = 2;

   /* The variable 'a' has a value and is of type integer, 
    * but when I generate this code I don't have this information */

   a = Convert.ToInt32(Console.ReadLine());
}

【讨论】:

  • 是的,但正如我所说,当我生成代码时,我不知道变量“a”是一个整数来进行解析。
【解决方案2】:

像这样的通用解析器怎么样,它查看字符串并尝试查看它是否与您列出的类型之一匹配。如果匹配,它会返回值和Type(这样您就可以尝试找出您所拥有的)。

public static (object value, Type type) ConvertToAnything(string input)
{
    if (int.TryParse(input, out var intResult))
    {
        return (intResult, typeof(int));
    }
    if (double.TryParse(input, out var doubleResult))
    {
        return (doubleResult, typeof(double));
    }
    if (input.Length == 1)
    {
        return (input[0], typeof(char));
    }
    if (input.Equals("true", StringComparison.InvariantCultureIgnoreCase))
    {
        return (true, typeof(bool));
    }
    if (input.Equals("false", StringComparison.InvariantCultureIgnoreCase))
    {
        return (false, typeof(bool));
    }
    return (input, typeof(string));
}

(object value, Type type) 返回类型表示该方法返回一个元组intType 配对。

这是一些测试代码,看看它是否有效:

var (result, type) = UniversalConverter.ConvertToAnything("123.4");
(result, type) = UniversalConverter.ConvertToAnything("false");
(result, type) = UniversalConverter.ConvertToAnything("123");
(result, type) = UniversalConverter.ConvertToAnything("a");

【讨论】:

  • 而不是了解输入的类型,我需要强制输入的类型(进行转换)为变量的类型,但我不知道变量的类型,我只知道它存在并且有一个值。此代码由我在 Java 中实现的代码生成器生成。
【解决方案3】:

使用该功能 @SetVariableValueFromInput 我可以将 String 转换为引用对象的类型。

public static void @main()
{
    var a = 1;
    var b = 2;

    @SetVariableValueFromInput(ref a, Console.ReadLine());
}

static void @SetVariableValueFromInput<T>(ref T myVariable, string myImput)
{
    var converter = TypeDescriptor.GetConverter(typeof(T));
    myVariable = (T)(converter.ConvertFromInvariantString(myImput));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 2015-08-30
    • 2011-11-02
    • 1970-01-01
    • 2017-09-04
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多