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,但在这种情况下,您会计算 expression两次(但如果预期类型不是表达式返回的类型,则会得到 null)。所以你在做双重评估。
  3. as仅适用于参考或装箱转换,不适用于执行用户定义的转换,因此如果您需要,那么as 不适合您。

请参阅MSDN 上的这篇文章

更新 2

我对IDictionary. 您可以只使用IDictionaryafteras而不是指定泛型类型参数。我想这取决于你的期望。

希望这可以帮助。

于 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,一切都很好。如果您不希望它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 回答