Roy*_*mir 10 .net c# ienumerable extension-methods dynamic
我写了这个扩展方法:
public static class A
{
public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f)
{
foreach (var element in f)
{
yield return (dynamic) element;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并测试了它:
List<int> l = new List<int>(){1,2,3};
Console.WriteLine ( l.AsDynamic().GetType());
Run Code Online (Sandbox Code Playgroud)
但输出是: typeof (IEnumerable<Object>)
为什么不typeof (IEnumerable<dynamic>) 呢?
我怎么能让它像它一样?
das*_*ght 23
我认为你对什么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!
}
Run Code Online (Sandbox Code Playgroud)
由于original.AsDynamic()给出了一系列dynamic对象,编译器不会抱怨你的调用SomeUnsupportedMethod.如果在运行时确实不支持该方法,程序将崩溃; 如果该方法实际上由元素支持SomeType,则不会发生崩溃,并且将调用该方法.
这就是dynamic为你做的一切; 静态地,"占位符"将保留object,typeof并将告诉你.但是直到运行时才会检查对象的确切功能(其方法和属性).
| 归档时间: |
|
| 查看次数: |
13307 次 |
| 最近记录: |