下面的函数返回一种动态类型,将其转换为 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
两次(但如果预期类型不是表达式返回的类型,则会得到 null)。所以你在做双重评估。as
仅适用于参考或装箱转换,不适用于执行用户定义的转换,因此如果您需要,那么as
不适合您。请参阅MSDN 上的这篇文章。
更新 2
我对IDictionary
. 您可以只使用IDictionary
afteras
而不是指定泛型类型参数。我想这取决于你的期望。
希望这可以帮助。
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
,一切都很好。如果您不希望它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,我认为没有办法将其转换为字典,因为它可能有自定义实现,甚至反射在这种情况下也不起作用