6

yield キーワードを使用した経験はあまりありません。型変換用にこれらの IEnumerable<T> 拡張機能があります。

私の質問は、最初のオーバーロードされたメソッドには、2 番目のメソッドから得られるのと同じ利回りの戻り値があるかどうかです。

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);
}
4

3 に答える 3

4

最初のオーバーロードを呼び出すと、すぐに 2 番目のオーバーロードが呼び出されます。本体のコードは実行されず、イテレータ ブロックを実装するネストされたクラスに移動されます。返されたでGetEnumerator()and thenMoveNext()が最初に呼び出されると 2 番目のオーバーロードのコードが実行を開始します。IEnumerable<TTo>

イテレータ ブロックの実装に関するかなり長い記事がありますが、興味深いと思われるかもしれません。

于 2009-02-09T14:46:19.913 に答える
2

はい、yield returnはコンパイル時に IEnumerator クラスを生成するだけだからです。 yield return単なるコンパイラマジックです。

于 2009-02-09T14:42:01.250 に答える
2

余談ですが...ほとんどの型コンバーターは文字列との間でのみ機能します。ここでのもう 1 つの興味深いオプションは、型に対して定義された静的変換演算子です。MiscUtilでこれを行う .NET 3.5 コードがいくつかあります。こちらConvertのメソッドを参照してください。

あなたのコメントについて:

このメソッドを使用する方法は、EF オブジェクトを WCF の DataContract オブジェクトに変換することです。so List(Hotels).ConvertTo(SerializableHotels, Hotels)()

シリアライゼーションを使用する必要があるように思えます。または、プロパティ名に直接的な関係がある場合は、おそらく次のようなものです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

于 2009-02-09T14:51:37.247 に答える