以下の関数は、ダイナミックのタイプを返します。これは、IDictionaryにキャストするための最も効率的な方法です。
public dynamic GetEntities(string entityName, string entityField)
以下の関数は、ダイナミックのタイプを返します。これは、IDictionaryにキャストするための最も効率的な方法です。
public dynamic GetEntities(string entityName, string entityField)
私はおそらくas
オペレーターと一緒に行きます。
var result = GetEntities("blah", "blahblah") as IDictionary<string,string>;
次に、null
チェックを行います。
アップデート
あなたの質問の「効率的な」部分に関して、私はas
あなたが取ることができる他のいくつかの道と比較してかなり効率的かもしれないと思います:
IDictionary<string,string>
例外をキャッチすることもできますが、制御フローに例外を使用することはお勧めできません。また、コストがかかります。expression is type ? (type)expression : (type)null
が、この場合、
expression
2回評価します(ただし、期待される型が式が返す型でない場合はnullを取得します)。つまり、二重の評価を行っています。as
は参照またはボクシングの変換にのみ有効であり、ユーザー定義の変換を実行することはできません。したがって、それが必要な場合は、適切でas
はありません。MSDNのこの記事を参照してください。
更新2
のキー/値型について仮定しましたIDictionary
。ジェネリック型パラメーターを指定する代わりに、IDictionary
afterを使用することもできます。as
私はそれがあなたが期待しているものに依存すると思います。
お役に立てれば。
var dict = GetEntities(entityName, entityField) as IDictionary
また
var dict = GetEntities(entityName, entityField) as IDictionary<string,string>
こちらです:
IDictionary dictionary = GetEntities("", "") as IDictionary;
次に、dictionary
結果のタイプに応じて、オブジェクトになるか、nullになりますGetEntities
。
IDictionary dict = GetEntities(name, field) as IDictionary;
次にnull
、すべてが正常であることを確認します。nullを望まないdict
が、代わりに例外をスローする場合は、次を使用します。
IDictionary dict = (IDictionary) GetEntities(name, field);
これを試して:-
var dict = GetEntities(entityName, entityField) as IDictionary<string,string>
それは本当にダイナミックの根底にあるタイプが何であるかに依存します
IDictionaryから動的に変換された場合は、簡単にキャストできます
var dict = GetEntities(entityName, entityField) as IDictionary
そうでなければ、物事は複雑になり、常にできるとは限りません
この場合、最初にGetType
メソッドを呼び出してアンダーリングタイプを確認する必要があります。DynamicObjectではなくマネージドタイプの場合は幸運です。リフレクションを使用してください。DynamicObjectの場合は、ディクショナリに変換する方法はないと思います。カスタム実装がある可能性があり、この場合はリフレクションでさえ機能しないためです