Lưu ý rằng tôi nhận thức được khác yieldinvb.net câu hỏi tại đây trên SO.Có cách nào để thực hiện các hoạt động giống như Caliburn trong VB.NET vì không có từ khóa lợi nhuận
Tôi đang phát xung quanh với Caliburn gần đây. Rất nhiều công cụ tuyệt vời ở đó, bao gồm triển khai co-routines.
Hầu hết công việc tôi đang làm là dựa trên C#, nhưng bây giờ tôi cũng đang tạo một hướng dẫn kiến trúc cho một cửa hàng duy nhất của VB.NET, dựa trên số small MVVM framework của Rob.
Mọi thứ trông rất đẹp ngoại trừ việc sử dụng đồng thức từ VB. Kể từ VB 10 được sử dụng, chúng ta có thể thử một cái gì đó giống như Bill McCarthy's suggestion:
Public Function Lines(ByVal rdr as TextReader) As IEnumerable(Of String)
Return New GenericIterator(Of String)
(Function(ByRef nextItem As String) As Boolean
nextItem = rdr.ReadLine
Return nextItem IsNot Nothing
End Function)
End Function
Tôi chỉ không hiểu làm thế nào một chút phức tạp hơn phương pháp đồng thường xuyên như hình dưới đây (lấy từ GameLibrary Rob) có thể được viết bằng VB:
public IEnumerable<IResult> ExecuteSearch()
{
var search = new SearchGames
{
SearchText = SearchText
}.AsResult();
yield return Show.Busy();
yield return search;
var resultCount = search.Response.Count();
if (resultCount == 0)
SearchResults = _noResults.WithTitle(SearchText);
else if (resultCount == 1 && search.Response.First().Title == SearchText)
{
var getGame = new GetGame
{
Id = search.Response.First().Id
}.AsResult();
yield return getGame;
yield return Show.Screen<ExploreGameViewModel>()
.Configured(x => x.WithGame(getGame.Response));
}
else SearchResults = _results.With(search.Response);
yield return Show.NotBusy();
}
Bất kỳ ý tưởng nào để đạt được điều đó, hoặc bất kỳ suy nghĩ nào về việc sử dụng đồng Caliburn trong VB?
Edit:
Marco chỉ tôi đến một hướng đi đúng. Sau khi xem xét trong Reflector - mã Visual Basic của GameLibrary Rob, tôi quản lý để sửa đổi GenericIterator Bill McCarthy để trở thành máy nhà nước một người đàn ông nghèo:
Private _state As Integer = -1
Public Function MoveNext() As Boolean Implements IEnumerator.MoveNext
_state += 1
Return _func(_Current, _state)
End Function
Và chúng ta có thể sử dụng nó như thế này:
Public Function ExecuteSearch() As IEnumerable(Of String)
' If we need some variable shared across states, define it here
Dim someSharedStuff As String = String.Empty
' Notice the second lambda function parameter below - state
Return New GenericIterator(Of IResult)
(Function(ByRef nextItem As IResult, state As Integer) As Boolean
Select Case state
Case 0
someSharedStuff = "First state"
nextItem = Show.Busy
Return True
Case 1
nextItem = Show.SomeLoadingScreen
' Do some additional processing here...
Return True
Case 2
' Do something with someSharedStuff variable...
Console.WriteLine(someSharedStuff)
nextItem = PerforSomemWebServiceCall()
Return True
'...
Case 6
nextItem = Show.NotBusy
Return False
End Select
Return False
End Function)
End Function
Nó chắc chắn không phải là thanh lịch như C# phiên bản, nhưng nó có vẻ là doable. Chúng tôi sẽ xem nếu có bất kỳ vấn đề với điều này. Nếu bất cứ ai có ý tưởng tốt hơn, tôi là tất cả tai.
Câu trả lời hay, bạn đã bỏ qua rất nhiều vấn đề và giải pháp có thể có ở đó. Hy vọng rằng, tôi đã quản lý để tạo ra một số bắt đầu thực hiện cho máy nhà nước (mặc dù không phải là rất thanh lịch), sau khi nhìn vào trình biên dịch tạo ra đầu ra trong mã phản xạ - Visual Basic. Câu hỏi được cập nhật với việc triển khai này. Tôi vẫn sẽ đọc bài viết của Wes Dyer, có vẻ như có một số thông tin lặp lại tốt ở đó. Cảm ơn! –