1

以下の関数は、ダイナミックのタイプを返します。これは、IDictionaryにキャストするための最も効率的な方法です。

 public dynamic GetEntities(string entityName, string entityField)
4

6 に答える 6

2

私はおそらくasオペレーターと一緒に行きます。

var result = GetEntities("blah", "blahblah") as IDictionary<string,string>;

次に、nullチェックを行います。

アップデート

あなたの質問の「効率的な」部分に関して、私はasあなたが取ることができる他のいくつかの道と比較してかなり効率的かもしれないと思います:

  1. 盲目的にキャストしてIDictionary<string,string>例外をキャッチすることもできますが、制御フローに例外を使用することはお勧めできません。また、コストがかかります。
  2. のような規則を使用することもできますexpression is type ? (type)expression : (type)nullが、この場合、 expression2回評価します(ただし、期待される型が式が返す型でない場合はnullを取得します)。つまり、二重の評価を行っています。
  3. asは参照またはボクシングの変換にのみ有効であり、ユーザー定義の変換を実行することはできません。したがって、それが必要な場合は、適切でas はありません。

MSDNのこの記事を参照してください。

更新2

のキー/値型について仮定しましたIDictionary。ジェネリック型パラメーターを指定する代わりに、IDictionaryafterを使用することもできます。as私はそれがあなたが期待しているものに依存すると思います。

お役に立てれば。

于 2012-11-28T14:39:35.730 に答える
0
var dict = GetEntities(entityName, entityField) as IDictionary

また

var dict = GetEntities(entityName, entityField) as IDictionary<string,string>
于 2012-11-28T14:39:51.047 に答える
0

こちらです:

IDictionary dictionary = GetEntities("", "") as IDictionary;

次に、dictionary結果のタイプに応じて、オブジェクトになるか、nullになりますGetEntities

于 2012-11-28T14:40:12.190 に答える
0
IDictionary dict = GetEntities(name, field) as IDictionary;

次にnull、すべてが正常であることを確認します。nullを望まないdictが、代わりに例外をスローする場合は、次を使用します。

IDictionary dict = (IDictionary) GetEntities(name, field);
于 2012-11-28T14:40:19.300 に答える
0

これを試して:-

 var dict = GetEntities(entityName, entityField) as IDictionary<string,string>
于 2012-11-28T14:40:25.403 に答える
0

それは本当にダイナミックの根底にあるタイプが何であるかに依存します

IDictionaryから動的に変換された場合は、簡単にキャストできます

var dict = GetEntities(entityName, entityField) as IDictionary

そうでなければ、物事は複雑になり、常にできるとは限りません

この場合、最初にGetTypeメソッドを呼び出してアンダーリングタイプを確認する必要があります。DynamicObjectではなくマネージドタイプの場合は幸運です。リフレクションを使用してください。DynamicObjectの場合は、ディクショナリに変換する方法はないと思います。カスタム実装がある可能性があり、この場合はリフレクションでさえ機能しないためです

于 2012-11-28T14:42:09.913 に答える