オブジェクトをオブジェクトにキャストする必要があります。ここでは、typename
を文字列として持っています。
例えば:
type-stringSystem.DateTime
とstring があります2012-09-17T10:19:23.5369243+02:00
。今DateTime
、文字列の値を持つオブジェクトが必要です。
これは可能ですか?
通常、この種の変換はキャストによって公開されません。これには多くの理由があります (別の質問の良いトピックになる可能性があります)。
オブジェクトの文字列表現が、そのオブジェクトにとってかなり「標準」である場合があります。たとえば、色は常にカンマ区切りの RGB トリプレットとしてシリアル化できます。
解析する必要がある型がロケール依存の表現 (日付など) を導入すると、事態はさらに難しくなります。この場合、フレームワークの設計者は、ようなインターフェイスを導入せず、3 番目のオブジェクト ( s、s、および変換クラス)IParseable
を使用してこの種のことを行うことにしました。コードはより複雑になりますが、作業を別のクラスに委譲する非常に複雑な変換を管理できます。以下をご覧ください。TypeConverter
TypeDescriptor
IConvertible
プリミティブ型の場合、それらを使用する必要さえない場合があります。インターフェイスとSystem.Convertクラスに依存できます。
あなたはキャストでそれを行うことはできません(私の意見では神に感謝します)が、Parse
a を受け入れてstring
必要な型を返すジェネリックメソッドを書くことができます。
T Parse<T>(string value)
私が覚えているのは、素敵なオープン ソースの型変換ライブラリ ( Universal Type Converter ) です。型を別の型に変換するために見つけたものすべてを使用して、多くの変換を管理します (たとえば、bool
値に使用できる異なる文字列表現の数を想像してみてください)。直接使用しない場合でも、この記事を読んで、これがどのように機能するかを理解する必要があります (また、ソース コードを調べて、まれなケースがどのように処理されているかを確認してください)。
あなたの質問に対する答えは、他のすべての答えの中にあり、まとめられるのを待っています。:)
akhisp が言ったように、タイプ文字列からタイプを取得します。
Type dateTimeType = Type.GetType("System.DateTime");
ここで、型コンバーターを使用して文字列を DateTime に変更します。
object date = Convert.ChangeType("2012-09-17T10:19:23.5369243+02:00", dateTimeType);
Type.GetType(String)メソッドを使用して、オブジェクトのタイプを取得します。次に、Activator.CreateInstance(Type Object [])を呼び出して、そのオブジェクトのインスタンスを構築します。ただし、文字列を受け取るコンストラクターがあることがわかっていると仮定します。