2013-08-15 4 views
-1

C# для VB.NET Вот соответствующий C# кодКак преобразовать это C# Событие/Делегат код в VB.NET (2008 или 2010)

namespace MyApp { 
    public delegate bool AllocHandlerDelegate(int param1); 

    public interface ILoader { 
    event AllocHandlerDelegate evAlloc; 
    bool Load(); 
    } 

    public class MyLoader : ILoader { 
    public event AllocHandlerDelegate evAlloc; 

     public bool Load() { 
      try { 
      if (this.evAlloc != null && !evAlloc(1)) 
          return false; 
     } 
    } 
} 

Вот что я придумал до сих пор. Делегат C# - это функция, которая возвращает логический результат. Поэтому я преобразовал определение делегата и объявление события следующим образом.

Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean 
    Public Event evAlloc As AllocHandlerDelegate 

Visual Studio Возвращается с сообщением об ошибке: «События не могут быть объявлены с типом делегата, который имеет тип возвращаемого значения»

Итак, я сделал это SUB и завершил перевод следующим образом *.

Namespace MyApp 
    Public Delegate Sub AllocHandlerDelegate(ByVal param1 As Integer) 

    Public Interface ILoader 
     Event evAlloc As AllocHandlerDelegate 

    Function Load() As Boolean 
    End Interface 

    Public Class MyLoader 
     Implements ILoader 

     Public Event evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc 

     Public Function Load() as Boolean Implements ILoad.Load 
      Try 
        If Me.evAllocEvent IsNot Nothing AndAlso Not evAlloc(1) Then 
         Return False 
      End Try 
     End Function 
    End Class 
End Namespace 

* Примечание: Я уже понял, что я не мог проверить на «Событие» объекта не должно быть ничего, но для VB внутренний делегат объекта * именем_события * Event.

Однако для второй части я не знаю, что с этим делать. Там появляется следующее сообщение об ошибке: «Открытое событие evAlloc (param1 As Integer)» является событием и не может быть вызвано напрямую. Используйте выражение «RaiseEvent», чтобы поднять событие.

Любые идеи ?! Спасибо

ответ

-1

Это является VB версии, эти встроенные функции требуют Framework 4.0 или выше ...

ILoader.evAlloc = Function(rows As Object) 
           Dim p As Person = TryCast(rows, Person) 
           If (p.Age And 1) Then 
            Return 0 
           Else 
            Return 1 
           End If 
          End Function 

К сожалению, не читал «2010», вам нужно использовать;

yourfunction.yourevent = New eventype(AddressOf yourfunction) 

or use;

addhandler 

http://msdn.microsoft.com/en-us/library/6yyk8z93(v=vs.90).aspx

1

Сообщение об ошибке довольно ясно:

Общественный evAlloc Event (param1 As Integer)»это событие, и не может быть вызван непосредственно. Используйте выражение «RaiseEvent», чтобы поднять событие.

Это событие, вы не можете назвать его напрямую. Используйте заявление «RaiseEvent» вместо:

RaiseEvent evAlloc(1) 

Ваше событие не может возвращать значение (С # эквивалент может), но вы можете использовать обычный делегат вместо этого.

Public Delegate Function AllocHandlerDelegate(ByVal param1 As Integer) As Boolean 

Public Interface ILoader 
    Property evAlloc As AllocHandlerDelegate 
    Function Load() As Boolean 
End Interface 

Public Class MyLoader 
    Implements ILoader 

    Public Property evAlloc As AllocHandlerDelegate Implements ILoader.evAlloc 

    Public Function Load() as Boolean Implements ILoader.Load 
      If Me.evAlloc IsNot Nothing AndAlso Not evAlloc(1) Then _ 
       Return False 
      ' Do Stuff ' 
      Return True 
    End Function 
End Class 

Использование событий, которые возвращают значения являются плохими, так как события могут иметь несколько абонентов, и вы, вероятно, не знаете, какое значение будет получить возвращается.

 Смежные вопросы

  • Нет связанных вопросов^_^