[英]To convert IEnumerable<dynamic> to IEnumerable<DataRow>
[英]Convert to IEnumerable<dynamic>?
我寫了這個擴展方法:
public static class A
{
public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f)
{
foreach (var element in f)
{
yield return (dynamic) element;
}
}
}
並測試了它:
List<int> l = new List<int>(){1,2,3};
Console.WriteLine ( l.AsDynamic().GetType());
但是輸出是: typeof (IEnumerable<Object>)
為什么它不是typeof (IEnumerable<dynamic>)
?
我怎么能讓它像它一樣?
我認為你對dynamic
意味着什么有誤解。 本質上,當您告訴編譯器對象的類型是dynamic
,您“保證” 運行時的對象將支持您調用的任何方法或屬性,以換取編譯器在編譯時不抱怨。 您還承諾,如果您違背承諾,您將面臨后果。
當你說對象是dynamic
,編譯器不能對類型做出假設,因此它使用object
,知道任何東西都可以存儲為object
。 當你創建一個IEnumerable<dynamic>
,它變成了IEnumerable<object>
,有一個顯着的區別:你可以調用它的元素上的任何方法,編譯器不會說一個字:
IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
由於original.AsDynamic()
提供了一系列dynamic
對象,因此編譯器不會抱怨您對SomeUnsupportedMethod
的調用。 如果在運行時確實不支持該方法,程序將崩潰; 如果SomeType
元素實際支持該方法,則不會發生崩潰,並且將調用該方法。
這一切都是dynamic
將為你做的; 靜態地,“占位符”將保持object
,而typeof
將告訴你。 但是直到運行時才會檢查對象的確切功能(其方法和屬性)。
通過設計, 運行時綁定的行為與靜態綁定的行為盡可能相似 。
所以運行時類型是typeof (IEnumerable<Object>)
靜態類型是typeof (IEnumerable<dynamic>)
也
運行時在概念上對待它
typeof(object)==typeof(dynamic)
所以,
動態類型就像對象,除了它允許您以編譯時未知的方式使用。
嘗試使用Linq Extension方法Cast() 。 但我不確定它是否適用於動態。
因為dynamic
不是一種類型
Console.WriteLine(typeof(dynamic)); // error
dynamic只是在運行時解析實際類型
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.