実行時に型を変換する方法はありますか?
-
10-07-2019 - |
質問
私のシナリオはシンプルでなければなりません...変換したいタイプは FROM は常に 'string'です。変換したいものは... int、DateTimes、...文字列など、多くのものになる可能性があります。
これは簡単です:
string valueToConvertFrom = "123";
int blah = Convert.ToInt32(valueToConvertFrom);
しかし...変換する必要がある値が 'Int'(または何でも)であることは(実行時まで)わかりません。私はこれを試しました:
string valueToConvertFrom = "123";
Type convertToType = typeof(int);
object blah = Convert.ChangeType(valueToConvertFrom, convertToType);
しかし、次のエラーが表示されます:" Object must implement IConvertible。
switchステートメントを実行して" Convert.ToBlah"を呼び出す必要はありません。型名に基づいて...提案はありますか?
解決
それを行うためのクリーンな方法は、TypeConverterを使用することです。 TypeDescriptorを呼び出すことで、タイプコンバーターのインスタンスを取得できます。 .GetConverter を実行してから、タイプコンバーターのインスタンスを使用して変換を行います。 次のようなものです:
string valueToConvertFrom = "123";
Type convertToType = typeof(int);
TypeConverter tc = TypeDescriptor.GetConverter(convertToType);
object blah =tc.ConvertFromString(valueToConvertFrom);
他のヒント
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 :/
}
.NETの型変換の質問に一般的に適用されるティモシーの質問は、非常に大きな問題です。既知の型を持つ特定のシナリオでは変換戦略はやや単純ですが、残念ながら、.NETの実装には、実行時に任意の型から別の型への型変換を実現する一般化された戦略はありません。ただし、Microsoftは、型変換の一般的な概念に関する次のような優れたガイドラインを提供しています。
システムで同じ一般的な問題に対処する必要があり、ソリューションとして、すべての標準戦略を1つの方法に統合しました。この問題の範囲は広く、関連する変換戦略はさまざまであるため、この統合アプローチは完全な技術記事でのみカバーできます。ただし、同様の一般的なソリューションを開発する場合に対処する必要がある全体的な要件をしっかり把握できるように、ここにメソッドドキュメントのコピーを提供します。ここに私のドキュメントへのリンクがあります:
これがお役に立てば幸いです、
マーク