![](/img/trans.png)
[英]“An object reference is required for the non-static field, method or property.” while compiling C# code at runtime
[英]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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.