簡體   English   中英

轉換為IEnumerable <dynamic>?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM