2011-11-22 7 views
5

(解決済み)XMLファイルの説明に基づいて、コントロールの一部を動的に作成できるアプリケーションを構築しています。
私が今必要とするのは、TryParse()メソッドと非常によく似たものです。文字列変数のテキストを型に変換することができれば、(wihtout throwing/catching exception)他の変異体(myType)。
問題myTypeは、.NETのタイプのいずれかとすることができるということです。DateTime, Bool, Double, Int32など文字列を他のさまざまな型に変換できるかどうかをテストします。

例:

string testStringOk = "123"; 
string testStringWrong = "hello"; 
string myType = "System.Int32"; 

bool test1 = CanCovertTo(testStringOk, myType);  //true 
bool test2 = CanCovertTo(testStringWrong, myType); //false 

どうCanCovertTo(string testString, string testType)機能は次のようになりますでしょうか?

は、私が手に最も近いコード以下の通りです:間違った文字列から変換しようとしながら

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 

    converter.ConvertFrom(testString); //throws exception when wrong type 
    return true; 
} 

しかし、それは例外をスローし、そして私はそのためtry {} catch()を使用しません。


ソリューション:

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 
    return converter.IsValid(testString); 
} 
+1

なぜ、try/catchを使用したくないのですか? – PVitt

+1

なぜCanConvertという名前の関数で値を変換しようとしていますか?あなたは単に "return converter.CanConvertFrom(typeof(string))"を返すことはできませんか? – Grrbrr404

+0

@PVitt:これはちょうど「ベストプラクティス」の話ですが、通常のプログラムアクションで例外を扱わないようにすべきです。私はそれがTryParse()メソッドがParse()と一緒に存在する理由だと考えています。正直なところ、これよりも優れた方法があれば、私が必要なことをすることができ、私はそれを好む。 :) – mj82

答えて

6

が、私は、メソッドTypeConverter.IsValidをチェックします:CanConvertFromから

は、.NET Framework version 4以降では、isValidメソッドがキャッチ例外とConvertFromメソッド。入力値の型によってCanConvertFromがfalseを返す場合、または入力値によってConvertFromが例外を発生させる場合、IsValidメソッドはfalseを返します。

つまり、自分でtry ... catchを使用しない場合は、値を2倍に変換します。

+0

偉大な答え。これは実際に私が先週質問した問題の問題を解決します。 – psubsee2003

6

タイプを文字列として渡す代わりに、ジェネリックを使用する必要があります。彼らは、内蔵されている場合

public bool CanConvert<T>(string data) 
{ 
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
    return converter.IsValid(data); 
} 

使用

bool test1 = CanConvert<Int32>("1234"); // true 
bool test2 = CanConvert<Int32>("hello"); // false 
+0

ジェネリックスはOPがコンパイルタイプでタイプを知っている必要があります。 – psubsee2003

+0

これは、前もって正確な型を知っていた場合や、次のようなことができた場合に**完璧になります** 'bool test1 = CanConvert (testStringOk);'しかし、タイプを知っていれば、それは動的に読み込まれ、文字列に保持されます。 – mj82

+0

@ mj82 - ああ、私の答えは合っています。 – James

0

は、.NETのタイプ、あなたはSystem.TypeCodeに基づいて変換を行うことができます。 XMLに型コードを格納したり、型文字列をTypeCodeに変換したりできます。

+0

私はそれについて考えてきましたが、それには余りにも多くの行があります。 :) TypeConverter.IsValidを使用すると、3行で処理できます。とにかくありがとう :) – mj82

関連する問題