C# ссылка на объект обязательна для нестатического поля, метода или свойства c - PullRequest
0 голосов
/ 01 мая 2020

Я искал статистические c методы и нестатические c свойства, но я не понимаю, как это применимо здесь. Прошло много времени с тех пор, как я посмотрел код C#. Я получаю следующее сообщение об ошибке из следующего кода. Любая помощь будет принята с благодарностью.

(ожидаемо) Task> IgRestApiClient.createPositionV2 (CreatePositionRequest createPositionRequest) Создает OT C position @param createPositionRequest запрос на создание позиции @return OT C создать ответ о позиции Ссылка на объект требуется для нестатического c поля, метода или свойства 'IgRestApiClient.createPositionV2 (CreatePositionRequest)'

public async void BuyThis()
{
    try
    {
        var buyDataX = new CreatePositionRequest
        {
            epic = "THIS",
            expiry = "MAY-20",
            direction = "SELL",
            size = 1,
            level = 100,
            orderType = "LIMIT",
            guaranteedStop = false,
            stopLevel = null,
            stopDistance = null,
            trailingStop = false,
            trailingStopIncrement = null,
            forceOpen = false,
            limitLevel = null,
            limitDistance = null,
            quoteId = null,
            currencyCode = "USD",
            timeInForce = "EXECUTE_AND_ELIMINATE",
        };

        var response = await IgRestApiClient.createPositionV2(buyDataX);
    }

    catch (Exception ex)
    {

    }
}

public async Task<IgResponse<CreatePositionResponse>> createPositionV2(dto.endpoint.positions.create.otc.v2.CreatePositionRequest createPositionRequest)
        {
            return await _igRestService.RestfulService<CreatePositionResponse>("/gateway/deal/positions/otc", HttpMethod.Post, "2", _conversationContext, createPositionRequest);
        }

Ответы [ 3 ]

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

У вас есть это не стати c класс:

public class IgRestApiClient{

    public async Task<IgResponse<CreatePositionResponse>> createPositionV2(CreatePositionRequest createPositionRequest)
    {
        return await _igRestService.RestfulService<CreatePositionResponse>("/gateway/deal/positions/otc", HttpMethod.Post, "2", _conversationContext, createPositionRequest);
    }
}

Вы пытаетесь использовать его статически:

var response = await IgRestApiClient.createPositionV2(buyDataX);

Вам либо нужно это (сделайте класс стати c):

public static class IgRestApiClient{

Или вот это (сначала создайте экземпляр):

var x = new IgRestApiClient();
var response = await x.createPositionV2(buyDataX);

Какой выбрать? Ну .. какой бы ни использовался в другом месте. Если это единственное использование, я думаю, вам нужно решить, основываясь на том, как IgRestApiClient выглядит, как должен вести себя его жизненный цикл. Возможно, он использует что-то должным образом и, следовательно, выглядит так, как будто он должен быть единичным экземпляром, или, возможно, он утилизирует что-то после однократного использования и, следовательно, полагается на обновление при каждом использовании. (У меня такое ощущение, что изначально это не ваш код, который вы поддерживаете)


Кстати, сигнатура метода станет проще, если вы using dto.endpoint.positions.create.otc.v2, если вы еще этого не сделали - тогда вы можно просто сослаться на CreatePositionRequest

Кроме того, вы можете объявить этот метод следующим образом:

    public Task<IgResponse<CreatePositionResponse>> createPositionV2Async(CreatePositionRequest createPositionRequest)
    {
        return _igRestService.RestfulService<CreatePositionResponse>("/gateway/deal/positions/otc", HttpMethod.Post, "2", _conversationContext, createPositionRequest);
    }
}

Здесь может не потребоваться использование async / await, поскольку метод не выполняет ничего, кроме как сделать звонок, получить задание и передать его. Это не значит, что он больше не асин c в своем поведении; он возвращает задачу, он асинхронный, и я переименовал его, чтобы выделить это, но если у вас есть методы, которые ничего не делают с задачами, отличными от return await, то вы можете просто вернуть задачу, которую другой Метод создан и пусть вызывающий метод ожидает его точно так же.

Прочитайте Какова цель "return await" в C#? для некоторого интересного обсуждения концепции

1 голос
/ 01 мая 2020
var response = await IgRestApiClient.createPositionV2(buyDataX);

IgRestApiClient - это не объект, а определение класса, поэтому он сообщает вам, что вы пытаетесь использовать метод non-stati c, как если бы он был stati c.

Initiate IgRestApiClient с new IgRestApiClient(), а затем использовать этот объект для вызова createPositionV2.

0 голосов
/ 01 мая 2020

Вам нужно инициализировать объект, и только тогда вы можете вызывать методы не static класса. Как я вижу, IgRestApiClient не является static, поэтому вам нужно инициализировать экземпляр класса перед его вызовом.

IgRestApiClient _igRestApiClient = new IgRestApiClient();

Затем вы можете вызвать его как

var response = await _igRestApiClient.createPositionV2(buyDataX);

для лучшего решения с внедрением зависимостей вы можете сделать это следующим образом:

public partial class IgRestApiClient
    {
        private PropertyEventDispatcher eventDispatcher;
        private ConversationContext _conversationContext;

        private IgRestService _igRestService;

        public IgRestApiClient(string environment, PropertyEventDispatcher eventDispatcher)
        {
            this.eventDispatcher = eventDispatcher;
            this._igRestService = new IgRestService(eventDispatcher, environment);
        }




    ///<Summary>
    ///Creates an OTC position
    ///@param createPositionRequest the request for creating a position
    ///@return OTC create position response
    ///</Summary>

    public async Task<IgResponse<CreatePositionResponse>> createPositionV2(dto.endpoint.positions.create.otc.v2.CreatePositionRequest createPositionRequest)
    {
        return await _igRestService.RestfulService<CreatePositionResponse>("/gateway/deal/positions/otc", HttpMethod.Post, "2", _conversationContext, createPositionRequest);
    }

Для справки:

https://github.com/IG-Group/ig-webapi-dotnet-sample/blob/master/IGWebApiClient/IGRestApiClient.cs

https://csharp.hotexamples.com/site/file?hash=0x52fbb58774cf38505f1f8d4da108670fffda8578a1b7dcb434a671907f5ddaab&fullName=IGApi / IGApiClientApplication.cs и проект = JBetser / MiDax

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