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)
- 我怎样才能让它变成这样
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类型。”@Leedynamic
是一种在运行时未知的类型。dynamic和object类似,只是dynamic允许您执行编译时无法执行的操作time@Lee说typeof(List)
合法吗?当然,如果你说dynamicd1=123;d1.GetType()
您期望的是System.Int32
,其中asdynamic 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错了!”)代码>