非静态字段、方法或属性需要C#对象引用



我一直在查找静态方法和非静态属性,但我不明白它在这里是如何应用的。我已经有一段时间没有研究C#代码了。我从以下代码中得到以下错误消息。如有任何帮助,我们将不胜感激。

(可用(任务>IgRestApiClient.createPositionV2(CreatePositionRequest CreatePositionRequest(创建OTC仓位@param createPositionRequest创建仓位的请求@return OTC创建仓位响应非静态字段、方法或属性"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不是一个对象,而是一个类定义,所以它告诉你,你试图使用一个非静态方法,就好像它是静态的一样。

使用new IgRestApiClient()启动IgRestApiClient,然后使用该对象调用createPositionV2。

您有一个非静态类:

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

你要么需要这个(使类静态(:

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以外的任务不做任何事情,那么您可以只返回另一个方法创建的task,并让调用方法等待它。

读一读";返回等待";在C#中?关于概念的一些有趣的讨论

您需要初始化一个对象&则只能调用非CCD_ 4类的方法。正如我所看到的,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

最新更新