2017-11-03 10 views
-1
var custsType = Type.GetType("Customers");   
var customers = Json.Deserialize<custsType>(data); 

これは明らかに失敗します。クラスを文字列名で参照するにはどうすれば実行時にそれを供給できますか?型パラメータの文字列名から型を参照する

はまた、私はこれはだまされやすい人ではありません

EDIT ...その文字列表現、実際の強い型指定されたオブジェクトへのアクセス権を持ってできるようにする必要はありません。参照されたSOの投稿は強いタイプを返しません。動的オブジェクトのみ。私はまだあなたがタイプ名ハンドラを指定Json.Net使用答え

+0

私はこれがあなたが探している重複かもしれないと思う:https://stackoverflow.com/a/1606988/424129 –

+0

コンパイル時に型がわからないので、* customerとして使用することはできません.Name *動的に処理する必要があります。それから、(Json.Net) 'var jobj = JObjectを使うだけです。Parse(jsonstr); '' jobj ["name"] 'のようなプロパティを使います。 –

+0

*参照されたSOの投稿を使用しても強いタイプは返されません。動的オブジェクトのみ* - 実際これは間違っています。 [参照される回答](https://stackoverflow.com/a/32371686/3744182)では、JSONは要求された型のオブジェクトに逆シリアル化されますが、戻り値のシグネチャが 'object'であるメソッドによって返されます。すべてのC#オブジェクトの基本型。詳細については、[newtonsoft docs](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_DeserializeObject_2.htm)を参照してください。 – dbc

答えて

0

を持っていけない:

new JsonSerializerSettings 
    { 
     TypeNameHandling = TypeNameHandling.Objects, 
     TypeNameAssemblyFormat = System.Runtime.Serialization.Formatters.FormatterAssemblyStyle.Full 
    } 

参照:https://www.newtonsoft.com/json/help/html/SerializeTypeNameHandling.htm

+0

これはすばらしい答えです。それがなぜ投票されたのかわからない – LastTribunal

+0

@LastTribunalどの部分がとても素晴らしいですか?それは間違っていませんが、それがあなたのためにどのように役立つかを試してみてください.. –

+0

@ L.B。それは私が文字列referecnes – LastTribunal

0
var custsType = Type.GetType("Customers");   
var customers = JsonConvert.DeserializeObject(data, custsType); 

問題は、使用して難しさを持っているつもりだということです型が不明な場合はオブジェクトを返します。おそらくタイプ名は、パラメータでありそうでない場合、あなたはそれがコンパイル時に、あなたはこれを返すことを期待どのタイプか分からないことを示唆している

var customers = JsonConvert.DeserializeObject<Customers>(data); 

行っているでしょう。その問題は、コンパイル時に型が分からなければ、取得したオブジェクトで何ができるかがはっきりしないことです。

オブジェクトのプロパティにアクセスする場合は、そのオブジェクトの種類を前提にいくつかの前提を設定する必要があります。それ以外の場合は、逆シリアル化されたオブジェクトがそのプロパティを持つことは期待できません。

挑戦は問題を解決する方法ではなく、最初に問題がないようにアプローチを再考する方法です。

理想的には、再びこのようになります。これは、あなたがコンパイル時に予想されるタイプを知りたい:データが予想される型に直列化復元できない場合

var customers = JsonConvert.DeserializeObject(data, custsType); 

はその後、それが例外をスローします発信者に合っている必要があります。

a)あなたはそのタイプがわからない、またはb)反射を使用してプロパティを見つけなければならない場合、何かが間違っていて、それを修正することができます。

var name = myObject["Name"]; 

が反射よりも簡単ですが、それは最終的にあなたが本当に知らないの両方のケースで

var property = myObject.GetType().GetProperty("Name"); 
var name = property.GetValue(myObject); 

と同じことだ。このようなプロパティにアクセスしようとすると


「名前」プロパティが存在するかどうかを判定します。オブジェクトをJSONに解析するには、シーンの裏側で反射を使用するだけです。

+0

これは素晴らしい答えです。それがなぜ投票されたのかわからない – LastTribunal

+0

はい、うまくいくでしょう。 「顧客」の物件にどのようにアクセスするのかを言う。反射? –

+1

それはあなたが具体的な意味でしようとしていることに対する答えなのかもしれませんが、尋ねられたように質問に答えません。 –

関連する問題