型が不明な文字列を目的の型にパースする
"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.";
}
}
}
}