2017-06-24 6 views
0

実行時に選択してインスタンス化するいくつかのクラスがあります。たとえば:実行時に生成される型を使用します。

public class MyClassA{ 
    public int property1 {get; set;} 
    public string property2 {get; set;} 
} 

public class MyClassB{ 
    public int property1 {get; set;} 
    public string property3 {get; set;} 
} 

はMyClassBは、実行時に選択された、のは、言ってみましょう:今すぐ

Type t = Type.GetType("MyNamespace.MyClassB"); 
Object myType = Activator.CreateInstance(t); 

が、私はこのような他のクラス/メソッドに渡すタイプとしてMYTYPEを使用したいと思います。

myType myDeserializedObject = JsonConvert.DeserializeObject<myType>(MyJsonString); 

「myTypeは変数ですが型として使用されています」というエラーがコードをコンパイルしません。

アクティブ化されたインスタンスをタイプに変換する方法や回避策はありますか?私が調べなければならない他のアプローチがあるかどうかを教えてください。 ありがとう!

+0

ちょうど '辞書<文字列、オブジェクト>'にdeseralizingたほうが良いかもしれませんか、単に '代わりに作成したクラスにdesearalizeしようとしているの' JObject.Parse(MyJsonString)を使用しますランタイム。 –

+0

以下の答えがうまくいかない場合( 'Type'を受け入れる非ジェネリックメソッドが利用可能になっていないため)、リフレクションマジックを動的に呼び出すことができます:https://stackoverflow.com/a/ 232621/455493 – Tseng

答えて

2

変数Typeを汎用として渡すことはできません。代わりに使用する

var myDeserializedObject = JsonConvert.DeserializeObject(MyJsonString, t); 
+0

あなたが意味していると確信しています: var myDeserializedObject = JsonConvert.DeserializeObject(MyJsonString、t); 私の例では "t"はタイプであり、 "myType"はそのインスタンスです。 – Felasfaw

1

変数を型として宣言するか、型を持つ汎用メソッドを呼び出すと、型チェックはコンパイル時に行われます。実行時まで型がわからない場合は機能しません。これが理由の2つです:

myType myDeserializedObject = JsonConvert.DeserializeObject<myType>(MyJsonString); 

...コンパイルできません。コンパイラは、myDeserializedObjectを作成するタイプを認識しておらず、myTypeの種類が分からない限り、myTypeに対応するバージョンDeserializeObject<T>をコンパイルできません。

この作業を行う方法はたくさんありますが、ある時点ではタイプチェックロジックを実行する必要があります。たぶん、このような何か:

if (myType == typeof(Widget)) 
{ 
    Widget myWidget = JsonConvert.DeserializeObject<Widget>(MyJsonString); 
    // do something with a Widget here 
} 
else if (myType == typeof(Gizmo)) 
{ 
    Gizmo myGizmo = JsonConvert.DeserializeObject<Gizmo>(MyJsonString); 
    // do something with a Gizmo here 
} 
関連する問題