簡體   English   中英

非靜態字段、方法或屬性需要 C# object 引用

[英]C# object reference is required for the non-static field, method, or property

我一直在查找 static 方法和非靜態屬性,但我不明白它是如何應用在這里的。 自從我查看 C# 代碼以來已經有一段時間了。 我從以下代碼中收到以下錯誤消息。 任何幫助將不勝感激。

(awaitable) Task > IgRestApiClient.createPositionV2(CreatePositionRequest createPositionRequest) Creates an OTC position @param createPositionRequest the request for creating a position @return OTC create position response An object reference is required for the non-static field, method, or property '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);
        }
var response = await IgRestApiClient.createPositionV2(buyDataX);

IgRestApiClient is not an object, but a class definition, so it's telling you that you are trying to use a non static method as if it was static.

使用new IgRestApiClient()啟動 IgRestApiClient,然后使用該 object 調用 createPositionV2。

你有這個非 static class:

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);

你要么需要這個(使 class 靜態):

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,因為該方法除了進行調用並獲取任務並將其傳遞之外不做任何事情。 這並不意味着它的行為方式不再是異步的。 它返回一個任務,它是異步的,我已將其重命名以突出顯示這一點,但如果您的方法除了return await它們之外不對任務執行任何操作,那么您可能只返回另一個方法的任務創建並讓調用方法等待它。

閱讀C# 中“返回等待”的目的是什么? 圍繞這個概念進行一些有趣的討論

你需要初始化一個 object 然后只能調用非static class 的方法。 我可以看到IgRestApiClient不是static所以你需要在調用它之前初始化 class 的實例。

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&project=J

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM