型が不明な文字列を目的の型にパースする

"123" という文字列ならば整数型に変換し、"3.141592" という文字列ならば小数型に変換し、"true" という文字列ならば論理型に変換したい、という場合があります。

このような状況ならば TryParse というメソッドを使えばいいですが、int.TryParse() や double.TryParse() や bool.TryParse() のように、結局のところは型に従って条件分岐をしなければなりません。

この状況で少しでもラクをするメソッドを考えてみました。

メソッドの内部の TryParse() の第2引数は out var となっているところが、型による変数宣言を少なくする工夫です。

Form に下記のコンポーネントを配置してください。
TextBox textBox1;
TextBox textBox2;
Button button1;
Button button2;
Button button3;

オブジェクトの型の等価性の調べ方は
button1_Click() が、型の名称を示す文字列が同じかどうか調べる方法。
button2_Click() が、型を == 演算子で同じかどうか調べる方法。
button3_Click() が、型を is で同じかどうか調べる方法。
になっています。

ボタンを押したときに、ウインドウのタイトルバーにオブジェクトの型名を表示します。

textBox1 に、"123" や "3.141592" や "true" や "false" という文字列を入れてコードの動きをご確認ください。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace aaa
{
	public partial class Form000 : Form
	{

		// 文字列を数値型や論理型に変換トライする.
		private bool MyTryParse( out object value, String the_string )
		{

			bool ret;
			
			ret = int.TryParse( the_string, out var tmp0 );
			if ( ret )
			{
				value = tmp0;
			}
			else
			{
				ret = double.TryParse( the_string, out var tmp1 );
				if ( ret )
				{
					value = tmp1;
				}
				else
				{
					ret = bool.TryParse( the_string, out var tmp2 );
					if ( ret )
					{
						value = tmp2;
					}
					else
					{
						value = null;
						return false; // warning.
					}
				}
			}

			return true;

		}

		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click( object sender, EventArgs e )
		{

			String str_type_name = "";

			// 文字列を数値型や論理型に変換トライする.
			object value = null;
			String s = textBox1.Text;
			bool ret = MyTryParse( out value, s );  
			if ( !ret )
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = "";
				this.Text = str_type_name;

				// エラーダイアログを表示する.
				MessageBox.Show( "Error: MyTryParse();" );
				return; // warning.
			}
			else
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = value.GetType().Name;
				this.Text = str_type_name;
			}

			// オブジェクトの型の文字列比較で判定する.
			if ( str_type_name.Equals( typeof( int ).Name ) )
			{
				int value_i = (int)( value );
				textBox2.Text = value_i.ToString();
			}
			else if ( str_type_name.Equals( typeof( double ).Name ) )
			{
				double value_d = (double)( value );
				textBox2.Text = value_d.ToString();
			}
			else if ( str_type_name.Equals( typeof( bool ).Name ) )
			{
				bool value_b = (bool)( value );
				textBox2.Text = value_b.ToString();
			}
			else
			{
				textBox2.Text = "Error.";
			}

		}

		private void button2_Click( object sender, EventArgs e )
		{

			String str_type_name = "";

			object value = null;
			String s = textBox1.Text;
			bool ret = MyTryParse( out value, s );  
			if ( !ret )
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = "";
				this.Text = str_type_name;

				// エラーダイアログを表示する.
				MessageBox.Show( "Error: MyTryParse();" );
				return; // warning.
			}
			else
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = value.GetType().Name;
				this.Text = str_type_name;
			}

			// オブジェクトの型を == で判定する.
			if ( value.GetType() == typeof( int ) )
			{
				int value_i = (int)( value );
				textBox2.Text = value_i.ToString();
			}
			else if ( value.GetType() == typeof( double ) )
			{
				double value_d = (double)( value );
				textBox2.Text = value_d.ToString();
			}
			else if ( value.GetType() == typeof( bool ) )
			{
				bool value_b = (bool)( value );
				textBox2.Text = value_b.ToString();
			}
			else
			{
				textBox2.Text = "Error.";
			}

		}

		private void button3_Click( object sender, EventArgs e )
		{

			String str_type_name = "";

			object value = null;
			String s = textBox1.Text;
			bool ret = MyTryParse( out value, s );  
			if ( !ret )
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = "";
				this.Text = str_type_name;

				// エラーダイアログを表示する.
				MessageBox.Show( "Error: MyTryParse();" );
				return; // warning.
			}
			else
			{
				// すぐにフォームのタイトルバーの文字列に反映する.
				str_type_name = value.GetType().Name;
				this.Text = str_type_name;
			}

			// オブジェクトの型を is で判定する.
			if ( value is int )
			{
				int value_i = (int)( value );
				textBox2.Text = value_i.ToString();
			}
			else if ( value is double )
			{
				double value_d = (double)( value );
				textBox2.Text = value_d.ToString();
			}
			else if ( value is bool )
			{
				bool value_b = (bool)( value );
				textBox2.Text = value_b.ToString();
			}
			else
			{
				textBox2.Text = "Error.";
			}

		}
	}
}