重载使用收益率返回

时间:2009-02-09 14:37:00

标签: c# yield

我没有太多使用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);
}

3 个答案:

答案 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