转换为IDictionary

时间:2012-11-28 14:37:23

标签: c# idictionary

下面的函数返回一种Dynamic类型,将它强制转换为IDictionary的最有效方法是什么

 public dynamic GetEntities(string entityName, string entityField)

6 个答案:

答案 0 :(得分: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之类的约定,但在这种情况下,您可以评估 expression两次(但如果预期的类型不是,则会得到null) 表达式返回的类型)。所以你要加倍 评价。
  3. as仅适用于参考或装箱转换,不执行用户定义的转化,因此如果您需要,则as 不适合你。
  4. 请参阅MSDN上的this article

    更新2

    我对IDictionary的键/值类型做了一个假设。您可以在IDictionary之后使用as,而不是指定泛型类型参数。我想这取决于你的期望。

    希望这有帮助。

答案 1 :(得分:0)

var dict = GetEntities(entityName, entityField) as IDictionary

var dict = GetEntities(entityName, entityField) as IDictionary<string,string>

答案 2 :(得分:0)

这样:

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

然后,dictionary将成为您的对象,或者它将为null - 具体取决于GetEntities的结果类型。

答案 3 :(得分:0)

IDictionary dict = GetEntities(name, field) as IDictionary;

然后检查null,一切都很好。如果您不希望dict为null,但它会抛出异常,请使用

IDictionary dict = (IDictionary) GetEntities(name, field);

答案 4 :(得分:0)

试试这个: -

 var dict = GetEntities(entityName, entityField) as IDictionary<string,string>

答案 5 :(得分:0)

这实际上取决于什么是动态的基础类型

如果从IDictionary转换为动态,你可以简单地将其转换为

var dict = GetEntities(entityName, entityField) as IDictionary

如果没有,事情变得复杂,并且总是不可能做到

在这种情况下,您首先需要通过调用GetType方法来检查底层类型,如果它是托管类型而不是DynamicObject,您很幸运,使用反射,如果它是DynamicObject,我认为没有任何方式将它转换为字典,因为它可能有自定义实现甚至反射在这种情况下不起作用