我没有太多使用yield关键字的经验。我有这些IEnumerable< T>类型转换的扩展名。
我的问题是,第一个重载方法是否具有与第二种方法相同的回报效果?
public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList)
{
return ConvertFrom<TTo, TFrom>(toList, TypeDescriptor.GetConverter(typeof(TTo)));
}
public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(this IEnumerable<TFrom> toList, TypeConverter converter)
{
foreach (var t in toList)
yield return (TTo)converter.ConvertFrom(t);
}
答案 0 :(得分:4)
当你调用第一个重载时,它会立即调用第二个重载。这将不会执行其正文中的任何代码,这些代码将被移动到实现迭代器块的嵌套类中。首先在返回的GetEnumerator()
,然后上调用MoveNext()
然后IEnumerable<TTo>
时,第二次重载中的代码将开始执行。
我有一个相当长的article on the iterator block implementation,你可能会感兴趣。
答案 1 :(得分:2)
是的,因为 yield return 只是在编译时生成一个IEnumerator类。 yield return
只是编译魔术。
答案 2 :(得分:2)
顺便说一下......大多数类型转换器只能用于字符串。这里另一个有趣的选择可能是针对类型定义的静态转换运算符 - 我有一些.NET 3.5代码在MiscUtil中执行此操作 - 请参阅Convert
提到的here方法。
重新评论:
我使用这种方法的方式是 将EF对象转换为 WCF的DataContract对象。所以 清单(酒店).ConvertTo(SerializableHotels, 酒店)()
听起来你应该要么使用序列化,要么属性名称有直接关系,可能类似于PropertyCopy<To>.CopyFrom(from)
- 这又是来自MiscUtil(但Jon的一些工作)这一次) - 即
public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(
this IEnumerable<TFrom> list, TypeConverter converter)
{
return list.Select(item => PropertyCopy<TTo>.CopyFrom<TFrom>(item);
}
除此之外,你最好还是谈论Conversion<,>
而不是TypeConverter
。