2009-02-09 12 views
6

Tôi không có nhiều kinh nghiệm về việc sử dụng từ khóa lợi nhuận. Tôi có các tiện ích mở rộng số <T> cho loại chuyển đổi này.Sử dụng quá mức lợi tức lợi nhuận

Câu hỏi của tôi là phương pháp quá tải đầu tiên có cùng hiệu suất trả về lợi nhuận mà tôi nhận được từ phương pháp thứ hai?

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

Tôi sẽ cập nhật lại nhận xét của bạn cho Jon ... –

+0

Vui lòng thiết lập nhận xét của bạn làm câu trả lời trong http://stackoverflow.com/questions/1947919/template-style-is-not-setting- một số sở thích và tôi đánh dấu nó là chấp nhận. – FFire

Trả lời

4

Khi bạn gọi quá tải đầu tiên, nó sẽ ngay lập tức gọi quá tải thứ hai. Điều đó sẽ không thực thi bất kỳ mã nào trong phần thân của nó, nó sẽ được chuyển vào một lớp lồng nhau thực hiện khối lặp. Khi GetEnumerator() và sau đó MoveNext() được gọi đầu tiên trên IEnumerable<TTo>, sau đó mã trong quá tải thứ hai của bạn sẽ bắt đầu thực hiện.

Tôi có khá dài article on the iterator block implementation, mà bạn có thể thấy thú vị.

+0

Bạn có đồng ý với @Marc Gravell không? cách tôi đang sử dụng phương pháp này là dịch một đối tượng EF thành một đối tượng DataContract cho WCF. vì vậy Danh sách (Khách sạn) .ConvertTo (SerializableHotels, Hotels)(); – bendewey

+0

Tôi không có ý kiến ​​chắc chắn về những người chuyển đổi loại - nhưng tôi biết Marc biết nhiều hơn về nó hơn tôi. –

+0

Thực ra, Jon - nghe giống như một công việc cho người lập bản đồ của bạn trong MiscUtil (không thể nhớ tên). –

2

Vâng, bởi vì yield return chỉ tạo ra một lớp IEnumerator trên biên dịch. yield return chỉ là trình biên dịch ma thuật.

2

Là một sang một bên ... hầu hết các trình chuyển đổi kiểu chỉ hoạt động thành/từ chuỗi. Một tùy chọn thú vị ở đây có thể là các toán tử chuyển đổi tĩnh được định nghĩa dựa vào kiểu (s) - Tôi có một số mã .NET 3.5 thực hiện điều này trong MiscUtil - xem phương thức Convert được đề cập here.

Re bình luận của bạn:

cách tôi đang sử dụng phương pháp này là để dịch một đối tượng EF thành một đối tượng DataContract cho WCF. nên Danh sách (Khách sạn) .ConvertTo (SerializableHotels, Khách sạn)()

Có vẻ như bạn nên hoặc được sử dụng tuần tự, hoặc nếu tên thuộc tính có mối quan hệ trực tiếp, có lẽ cái gì đó như PropertyCopy<To>.CopyFrom(from) - đây là một lần nữa từ MiscUtil (nhưng một số công việc của Jon thời gian này) - tức là

public static IEnumerable<TTo> ConvertFrom<TTo, TFrom>(
    this IEnumerable<TFrom> list, TypeConverter converter) 
{ 
    return list.Select(item => PropertyCopy<TTo>.CopyFrom<TFrom>(item); 
} 

khác hơn thế, có lẽ bạn đang khá giả nói về một Conversion<,> chứ không phải là một TypeConverter.

+0

Cảm ơn tôi sẽ xem xét. – bendewey

+0

Marc, điều này thật tuyệt. Tôi không chắc liệu tôi có thể sử dụng nó do một số vấn đề cấp phép hay không. Tôi sẽ phải kiểm tra nhưng cảm ơn – bendewey

+0

Tôi muốn cung cấp cho bạn câu trả lời, bởi vì bạn đã trả lời câu hỏi chưa được hỏi ẩn của tôi và tôi cảm ơn bạn. Mặc dù, những người khác trả lời câu hỏi chính xác mà tôi đã hỏi về việc sử dụng năng suất. Suy nghĩ? – bendewey