C # для VB.NET: следует ли использовать AddHandler в этом случае? - PullRequest
0 голосов
/ 05 ноября 2018

Я имею дело со следующим кодом C #, который я хочу преобразовать в VB.NET:

var interactorAgent = host.InitializeVirtualInteractorAgent(currentWindowHandle, "ConsoleWindowAgent");

interactorAgent
    .AddInteractorFor(currentWindowBounds)
    .WithGazeAware()
    .HasGaze(() => Console.WriteLine("Hey there!"))
    .LostGaze(() => Console.WriteLine("Bye..."));

Я хочу получить обратный вызов функции, если произошли «.HasGaze» или «.LostGaze».

Я думаю, что должен использовать «AddHandler» вместо «=>», но я заблудился, как это сделать в VB.NET. Правильно ли я должен использовать AddHandler здесь?

Я думаю, что сложный код находится в этой декларации:

public static class InteractorExtensions
{
    public static GazeAwareBehavior WithGazeAware(this IMutableBehaviorsInteractor interactor);
    (...)
}

public class GazeAwareBehavior : EventHandlingBase, IBehavior, IChecksummable
{
    public const string HasGazeChangedToken = "HazGazeChanged";

    public GazeAwareBehavior();
    public GazeAwareBehavior(GazeAwareMode mode = GazeAwareMode.Normal, TimeSpan? delayTime = null);

    public TimeSpan DelayTime { get; set; }
    public GazeAwareMode Mode { get; set; }

    public event EventHandler<HasGazeChangedEventArgs> HasGazeChanged;
}

Но я не уверен в этом.

Это больше кода.

Если кто-нибудь сможет пролить свет на то, что мне нужно сделать, я был бы очень рад.

Спасибо.

    public static void Main(string[] args)
    {
        // Everything starts with initializing Host, which manages the connection to the 
        // Tobii Engine and provides all the Tobii Core SDK functionality.
        // NOTE: Make sure that Tobii.EyeX.exe is running
        var host = new Host();

        // InteractorAgents are defined per window, so we need a handle to it.
        var currentWindowHandle = Process.GetCurrentProcess().MainWindowHandle;
        // Let's also obtain its bounds using Windows API calls (hidden in a helper method below).
        var currentWindowBounds = GetWindowBounds(currentWindowHandle);
        // Let's create the InteractorAgent.
        var interactorAgent = host.InitializeVirtualInteractorAgent(currentWindowHandle, "ConsoleWindowAgent");

        // Next we are going to create an interactor, which we will define with the gaze aware behavior.
        // Gaze aware behavior simply tells you whether somebody is looking at the interactor or not.
        interactorAgent
            .AddInteractorFor(currentWindowBounds)
            .WithGazeAware()
            .HasGaze(() => Console.WriteLine("Hey there!"))
            .LostGaze(() => Console.WriteLine("Bye..."));

        Console.ReadKey(true);

        (...)
    }


public static class InteractorExtensions
{
    public static GazeAwareBehavior WithGazeAware(this IMutableBehaviorsInteractor interactor);
    (...)
}

public class GazeAwareBehavior : EventHandlingBase, IBehavior, IChecksummable
{
    public const string HasGazeChangedToken = "HazGazeChanged";

    public GazeAwareBehavior();
    public GazeAwareBehavior(GazeAwareMode mode = GazeAwareMode.Normal, TimeSpan? delayTime = null);

    public TimeSpan DelayTime { get; set; }
    public GazeAwareMode Mode { get; set; }

    public event EventHandler<HasGazeChangedEventArgs> HasGazeChanged;
}

Public Class VirtualInteractorAgent(Of TInteractor As IInteractor, TData)
    Inherits ProviderInteractorAgent(Of IInteractorRepository(Of TInteractor))

    Protected Sub New(agentId As String, defaultWindowId As String, repository As IInteractorRepository(Of TInteractor), createInteractorDelegate As CreateInteractorDelegate)

    Protected ReadOnly Property DefaultWindowId As String
    Protected ReadOnly Property Repository As IInteractorRepository(Of TInteractor)

    Public Sub RemoveInteractor(interactorId As String)
    Public Sub RemoveInteractors(ParamArray ids() As String)
    Public Sub Suspend()
    Public Sub [Resume]()
    Public Sub Clear()
    Protected Overrides Sub Dispose(disposing As Boolean)

    Public Function AddInteractorFor(data As TData) As TInteractor
    Public Function AddInteractorFor(data As TData, Optional parentId As String = "_RootId", Optional z As Double = 0, Optional windowId As String = Nothing, Optional id As String = Nothing) As TInteractor
    Public Function FindInteractor(interactorId As String) As TInteractor
    Public Function AddInteractorsFor(ParamArray datas() As TData) As IEnumerable(Of TInteractor)
    Public Function FindInteractors(ParamArray ids() As String) As IEnumerable(Of TInteractor)
    Public Delegate Function CreateInteractorDelegate(data As TData, Optional parentId As String = "_RootId", Optional z As Double = 0, Optional windowId As String = Nothing, Optional id As String = Nothing) As TInteractor
End Class

1 Ответ

0 голосов
/ 05 ноября 2018

Всякий раз, когда вы видите => в коде C #, вы смотрите на лямбда-выражение. Эквивалент (params) => body в C # равен Function(params) body или Sub(params) body в VB, в зависимости от того, оценивает ли body значение или нет. В вашем случае оба ваших Lambdas содержат Console.WriteLine, поэтому ни один из них не оценивается как значение, поэтому оба должны быть Sub:

Dim interactorAgent = host.InitializeVirtualInteractorAgent(currentWindowHandle, "ConsoleWindowAgent")

interactorAgent.AddInteractorFor(currentWindowBounds).
                WithGazeAware().
                HasGaze(Sub() Console.WriteLine("Hey there!")).
                LostGaze(Sub() Console.WriteLine("Bye..."));

Как правило, вы также можете указать, следует ли использовать Function или Sub по типу параметра. В этом случае и HasGaze, и LostGaze, вероятно, имеют параметр типа Action или аналогичный, что означает использование Sub. Если бы это было Func или подобное, то вы бы использовали Function. Action является делегатом, который не возвращает значение, а Func является делегатом, который возвращает значение.

...