首页 > 解决方案 > 循环属性 c#

问题描述

    static TestInitialization()
    {
      client = new HttpClient();
      client.BaseAddress = new Uri( URL_BASE_ADRESS );
      client.DefaultRequestHeaders.Add( "auth-key", Auth_Token );
    }

    private const String path = @"f:\specialproject\authdata.txt";
    internal static readonly String Login = File.ReadLines( path ).First(); //login in this file must be the first line
    internal static readonly String Password = File.ReadLines( path ).Last();//password - as second line
    internal static String Auth_Token
    {
      get
      {
        if( Auth_Token != null )
          return Auth_Token;
        else
          return LoginAndGetToken();
      }
      set
      {
        Auth_Token = LoginAndGetToken();
      }
    }

    internal static String LoginAndGetToken()
    {
      HttpRequestMessage request = new HttpRequestMessage( HttpMethod.Post, $"{URL_BASE_ADRESS}/console/home/login" );
      request.Content = new StringContent( "{\"login\":\"" + TestInitialization.Login + "\",\"password\":\"" + TestInitialization.Password + "\"}", Encoding.UTF8, "application/json" );

      Auth_Token = client.SendAsync( request ).GetAwaiter().GetResult().Headers.GetValues( "auth-key" ).ToArray()[ 0 ];
      return Auth_Token;
    }

这是我的代码的一部分。当执行静态构造函数并且我尝试获取Auth-Key属性时 - 在 getter 中,它在检查 null 时被循环。

我该如何实现这个逻辑?(不添加额外的私有字段)如果值为空,set则执行该块。或者LoginAndGetToken()有返回值的方法。

标签: c#.netproperties

解决方案


    internal static String Auth_Token
    {
      get
      {
        if( Auth_Token != null )
          return Auth_Token;
        else
          return LoginAndGetToken();
      }
      set
      {
        Auth_Token = LoginAndGetToken();
      }
    }

有两个堆栈溢出情况。第一个在get( return Auth_Token) 中,另一个在set(LoginAndGetToken方法设置Auth_Token值)

我想建议Lazy<T>与工厂一起使用

internal static Lazy<String> Auth_Token = new Lazy<String>(LoginAndGetToken);

internal static String LoginAndGetToken()
{
  HttpRequestMessage request = new HttpRequestMessage( HttpMethod.Post, $"{URL_BASE_ADRESS}/console/home/login" );
  request.Content = new StringContent( "{\"login\":\"" + TestInitialization.Login + "\",\"password\":\"" + TestInitialization.Password + "\"}", Encoding.UTF8, "application/json" );

  return client.SendAsync( request ).GetAwaiter().GetResult().Headers.GetValues( "auth-key" ).ToArray()[ 0 ];
}

这可以用于如下Auth_Token.Value调用:

client.DefaultRequestHeaders.Add( "auth-key", Auth_Token.Value );

PS没有额外的字段条件看起来很奇怪(并且Auth_Token不是字段它是属性)

PPS是家庭作业吗?有方法数量限制吗?您可以拥有一个Auth_Token属性来存储一个字符串值,以及在没有值GetAuth_Token()时返回Auth_Token或调用的方法LoginAndGetTokenAuth_Token

string GetAuth_Token()
{
  return Auth_Token = Auth_Token ?? LoginAndGetToken();
}

推荐阅读