C# 转换为IEnumerable<;动态>;?

C# 转换为IEnumerable<;动态>;?,c#,.net,dynamic,extension-methods,ienumerable,C#,.net,Dynamic,Extension Methods,Ienumerable,我写了这个扩展方法: public static class A { public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f) { foreach (var element in f) { yield return (dynamic) element; } } } 公共静态

我写了这个扩展方法:

public static class A
{
 public static IEnumerable<dynamic> AsDynamic<T>(this IEnumerable<T> f)
    {
        foreach (var element in f)
        {
                yield return (dynamic) element;
        }   
    }
}
公共静态A类
{
公共静态IEnumerable作为动态(此IEnumerable f)
{
foreach(f中的var元素)
{
收益(动态)要素;
}   
}
}
并对其进行了测试:

List<int> l   = new List<int>(){1,2,3};
Console.WriteLine ( l.AsDynamic().GetType());
List l=newlist(){1,2,3};
Console.WriteLine(l.AsDynamic().GetType());
但是,输出是:
typeof(IEnumerable)

  • 为什么它不是
    typeof(IEnumerable)

  • 我怎样才能让它变成这样


尝试Linq扩展方法。但我不确定它是否能与dynamic一起工作。

因为
dynamic
不是一种类型

Console.WriteLine(typeof(dynamic)); // error
动态只是在运行时解析实际类型

根据设计,运行时绑定的行为与静态绑定的行为尽可能类似

所以运行时类型应该是
typeof(IEnumerable)

静态类型将是
typeof(IEnumerable)

运行库在概念上处理这个问题

typeof(object)==typeof(dynamic)
所以


动态类型与对象类似,只是它允许您以编译时未知的方式使用。

我认为您误解了
动态
的含义。本质上,当您告诉编译器对象的类型是动态的时,您“承诺”对象在运行时将支持您调用的任何方法或属性,以换取编译器在编译时不抱怨。你还承诺,如果你违背诺言,你将面临后果

当您说一个对象是
动态的
时,编译器无法对该类型做出假设,因此它使用
对象
,知道任何东西都可以存储为
对象
。当您创建一个
IEnumerable
时,它会变成
IEnumerable
,有一个显著的区别:您可以对其元素调用任何方法,编译器不会说一个字:

IEnumerable<SomeType> original = ...
foreach (dynamic x in original.AsDynamic()) { // Using your method
    Console.WriteLine(x.SomeUnsupportedMethod()); // The compiler is silent!
}
IEnumerable original=。。。
foreach(original.AsDynamic()中的动态x){//使用您的方法
Console.WriteLine(x.SomeUnsupportedMethod());//编译器是静默的!
}
由于
original.AsDynamic()
提供了一系列
dynamic
对象,因此编译器不会抱怨您调用
SomeUnsupportedMethod
。如果在运行时确实不支持该方法,程序将崩溃;如果
SomeType
的元素实际上支持该方法,则不会发生崩溃,并且将调用该方法


这就是
动态
为您所做的一切;静态而言,“占位符”将保留为
对象
,而
类型
将告诉您同样的信息。但是,直到运行时才会检查对象的确切功能(其方法和属性)。

运行时没有
动态
类型,它们只是作为对象键入,方法绑定信息在涉及动态变量的每个调用站点输出。MSDN指的是“类型”另外:@Some1.Kill.The.DJ-尝试使用
typeof(dynamic)
会导致编译错误,“typeof运算符不能用于dynamic类型。”@Lee
dynamic
是一种在运行时未知的类型。dynamic和object类似,只是dynamic允许您执行编译时无法执行的操作time@Lee说
typeof(List)
合法吗?当然,如果你说
dynamicd1=123;d1.GetType()
您期望的是
System.Int32
,其中as
dynamic d2=new List();d2.GetType()
可能返回
List`1[System.Object]
?@JeppeStigNielsen-是的,
typeof(List)
是允许的,并且您是正确的,它在运行时与
typeof(List)
相同。正如我在对另一个答案的评论中所理解的,在C中编写
typeof(IEnumerable)
实际上是合法的(但没有用!),但它创建的运行时类型与
typeof(IEnumerable)
相同。但是,
typeof(dynamic)
不允许作为
typeof(object)
的同义词。顺便说一句,
GetType()
当然永远不会返回接口类型,因此原始海报并不精确。@RoyiNamir我不确定我是否理解您的屏幕截图(我不熟悉LINQPad)。这两行有不同的排版。它们不是两个
WriteLine
方法调用的输出。
GetType()
返回一个
RuntimeType
对象,在第一条
WriteLine
中,对其调用
ToString()
方法。该类型将是一个生成的类型(类具有一个奇怪的名称,其中包含
,以及
\uuuu
字符),因为您有一个迭代器块(
yield return
)。试试这个:
if(l.AsDynamic().GetType()==typeof(IEnumerable))抛出新异常(“Jeppe错了!”)