c# передача встроенного интерфейса, такого как метод делегата - PullRequest
0 голосов
/ 29 мая 2020

i ', m использую этот синтаксис в java:

 public interface Interaction
    {
        void onSuccess(String result);
        void onFailure(String error);
    }

    void getData(Interaction interaction)
    {
        //someCode
        interaction.onSuccess("foo");
    }

    void main()
    {
        getData(new Interaction()
        {
            @override
            void onSuccess(String result)
            {
                    //here is sucess part 
            }

            @override
            void onFailure(String error)
            {
                   //here is failure part 
            }
        })
    }

Я новичок в кодировке c#. как я могу реализовать эту структуру в c#? c# поддерживает встроенный интерфейс экземпляра как java?

1 Ответ

1 голос
/ 29 мая 2020

Один из способов изменить это - принять два параметра Action<string>:

void GetData(Action<string> onSuccess, Action<string> onFailure)
{
    //someCode
    onSuccess("foo");
}

void Main()
{
    GetData(onSuccess: result => {
        // success part...
    }, onFailure: error => {
        // failure part
    });
}

Другой способ - сохранить интерфейс IInteraction:

public interface IInteraction
{
    void OnSuccess(String result);
    void OnFailure(String error);
}

void GetData(IInteraction interaction)
{
    //someCode
    interaction.OnSuccess("foo");
}

Но иметь конкретный класс GenericInteraction, реализующий IInteraction:

class GenericInteraction : IInteraction {
    private Action<string> onSuccess;
    private Action<string> onFailure;
    public GenericInteraction(Action<string> onSuccess, Action<string> onFailure) {
        this.onSuccess = onSuccess;
        this.onFailure = onFailure;
    }

    public void OnSuccess(String result) { onSuccess(result); }
    public void OnFailure(String error) { onFailure(error); }
}

Таким образом, вызывающий метод может выбрать либо передать onSuccess, либо onFailure "inline":

GetData(new GenericInteraction(onSuccess: result => {
    // success part...
}, onFailure: error => {
    // failure part
}));

Или передайте что-то другое, реализующее IInteraction:

GetData(someOtherInteractionICreated);

Что ближе к тому, что вы могли бы сделать в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...