下面的函数返回一种Dynamic类型,将它强制转换为IDictionary的最有效方法是什么
public dynamic GetEntities(string entityName, string entityField)
答案 0 :(得分:2)
我可能会选择as
运算符。
var result = GetEntities("blah", "blahblah") as IDictionary<string,string>;
然后进行null
检查。
<强>更新强>
关于问题的“有效”部分,我认为as
与您可以采取的其他路径相比可能非常有效:
IDictionary<string,string>
和
然后捕获异常,但使用控制流的异常
不是一个好主意而且价格昂贵。expression is type ? (type)expression : (type)null
之类的约定,但在这种情况下,您可以评估
expression
两次(但如果预期的类型不是,则会得到null)
表达式返回的类型)。所以你要加倍
评价。as
仅适用于参考或装箱转换,不执行用户定义的转化,因此如果您需要,则as
不适合你。请参阅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,我认为没有任何方式将它转换为字典,因为它可能有自定义实现甚至反射在这种情况下不起作用