21

私のシナリオは単純なはずです... FROMを変換したい型は常に「文字列」です。私が変換したいものは... ints、DateTimes、...文字列など、多くのものになる可能性があります.

これは簡単です:

string valueToConvertFrom = "123";

int blah = Convert.ToInt32(valueToConvertFrom);

ただし...変換する必要がある値が「Int」(または何でも)であることは(実行時まで)わかりません。私はこれを試しました:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

object blah = Convert.ChangeType(valueToConvertFrom, convertToType);

しかし、「オブジェクトは IConvertible を実装する必要があります。」というエラーが表示されます。

switch ステートメントを実行して、型名に基づいて「Convert.ToBlah」を呼び出す必要はありません...何か提案はありますか?

4

3 に答える 3

30

それを行うためのクリーンな方法は、TypeConverter を使用することです。TypeDescriptor.GetConverterを呼び出し、型コンバーター のインスタンスを使用して変換を行うことにより、型コンバーターのインスタンスを取得できます。このようなもの:

string valueToConvertFrom = "123";

Type convertToType = typeof(int);

TypeConverter tc =  TypeDescriptor.GetConverter(convertToType);             

object blah =tc.ConvertFromString(valueToConvertFrom);
于 2008-11-23T20:15:28.120 に答える
5

.NETでの型変換の質問に一般的に適用されるティモシーの質問は、非常に大きな問題です。変換戦略は、既知の型を使用する特定のシナリオではいくぶん簡単ですが、残念ながら、実行時に任意の型から別の型への型変換を実行するための.NETの実装には一般化された戦略はなく、Redmondからのそのような戦略もありません。ただし、Microsoftは、次のような型変換の一般的な概念に関するいくつかの優れたガイドラインを提供しています。

私は自分のシステムで同じ一般的な問題に対処する必要があり、解決策として、すべての標準的な戦略を1つの方法に統合しました。この問題の範囲は広く、関連する変換戦略はさまざまであるため、この統合されたアプローチは完全な技術記事でのみカバーできます。ただし、同様の一般化されたソリューションを開発する場合に対処する必要のある全体的な要件をしっかりと把握するのに役立つことを願って、ここに私のメソッドドキュメントのコピーを提供します。これが私のドキュメントへのリンクです:

これがお役に立てば幸いです。

マーク

于 2011-10-29T23:32:50.350 に答える
5

String クラスは IConvertible を実装します。このコードは単純に機能する必要があります。どのバージョンの .NET を目指していますか?

object o = Convert.ChangeType( str, convertToType );

その上、あなたが言及したタイプのほとんどは Parse メソッドを実装しているので、あなたのベストショットはこのようなものかもしれません.

Type convertToType = ...;
MethodInfo mi = convertToType.GetMethod("Parse", BindingFlags.Static);
object blah;
if(mi != null)
{
    blah = mi.Invoke(null, new object[]{valueToConvertFrom});
}
else
{
    // the type doesn't implement the Parse method, handle it another way :/
}
于 2008-11-23T20:04:47.377 に答える