2017-06-29 10 views
0

これで少し苦労しましたが、私は非常に近いと感じています。 .NET MVC Webアプリケーションでは、私はassemblyinfo情報を問題なくフロントエンドに表示していました。少しの最適化で、そのコードを汎用ヘルパークラスに移したかったのです。 使いやすさのために私はそれを静的なクラスにしましたが、私はその過程でいくつかの障害にぶつかってきました。しかし、私は悲しいことに、それを使用しようとするとSystem.StackOverflowExceptionをスローします。ここでは、コードです:静的クラスからアセンブリバージョン情報を取得すると、スタックオーバーフロー例外がスローされます

public static class VersionInformationHelper 
{ 
    public static string GetVersionNumber 
    { 
     get 
     { 
      if (!string.IsNullOrWhiteSpace(GetVersionNumber.GetType().Assembly.GetName().Version.ToString())) 
      { 
       return "v" + GetVersionNumber.GetType().Assembly.GetName().Version.ToString(); 
      } 
      else 
      { 
       return string.Empty; 
      } 
     } 
    } 

    /// <remark> 
    /// This doesnt exactly return the commit hash so to speak. Well it does, but Teamcity is set to enter the corresponding commit hash information when building, 
    /// into productversion in "AssemblyInfo.cs". It could be any string really. But we assume that a commit hash will always be in that location. 
    /// It's "Assembly informational version" in the assemblyinfo patcher build feature in teamcity. 
    /// </remark> 
    public static string GetCommitHash 
    { 
     get 
     { 
      if (!string.IsNullOrWhiteSpace(System.Diagnostics.FileVersionInfo.GetVersionInfo(GetVersionNumber.GetType().Assembly.Location).ProductVersion)) 
      { 
       return System.Diagnostics.FileVersionInfo.GetVersionInfo(GetVersionNumber.GetType().Assembly.Location).ProductVersion; 
      } 
      else 
      { 
       return string.Empty; 
      } 
     } 
    } 

    public static string GetBuildDate 
    { 
     get 
     { 
      return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:dd/MM/yy HH:mm:ss}", System.IO.File.GetLastWriteTime(GetVersionNumber.GetType().Assembly.Location)); 
     } 
    } 
} 

EDIT

のフィードバックに基づいて、固定コード(GetVersionNumberとGetCommitHashは」変更されました):

public static class VersionInformationHelper 
{ 
    public static string GetVersionNumber 
    { 
     get 
     { 
      if (!string.IsNullOrWhiteSpace(System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString())) 
      { 
       return "v" + System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); 
      } 
      else 
      { 
       return string.Empty; 
      } 
     } 
    } 

    /// <remark> 
    /// This doesnt exactly return the commit hash so to speak. Well it does, but Teamcity is set to enter the corresponding commit hash information when building, 
    /// into productversion in "AssemblyInfo.cs". It could be any string really. But we assume that a commit hash will always be in that location. 
    /// It's "Assembly informational version" in the assemblyinfo patcher build feature in teamcity. 
    /// </remark> 
    public static string GetCommitHash 
    { 
     get 
     { 
      if (!string.IsNullOrWhiteSpace(System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).ProductVersion)) 
      { 
       return System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location).ProductVersion; 
      } 
      else 
      { 
       return string.Empty; 
      } 
     } 
    } 

    public static string GetBuildDate 
    { 
     get 
     { 
      return string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0:dd/MM/yy HH:mm:ss}", System.IO.File.GetLastWriteTime(GetVersionNumber.GetType().Assembly.Location)); 
     } 
    } 
} 
+1

サイドノート:プロパティフォームのメソッドは一般的に最適化されていないので、悪い考えです。プロパティとしてプロパティを保持するのが最善であり、メソッドである場合はメソッドでなければならない –

+1

良い情報、私はそれを念頭に置いておきます:) –

答えて

1

あなたは同じのゲッターからGetVersionNumberを読んでいますGetVersionNumber(2回)これは無限に(またはスタックオーバーフローが発生するまで)ループします。

Assembly.GetExecutingAssembly().GetName().Version.ToString()または別の方法で2つの発生を変更する必要があります。

+0

あなたのヒントに従っていただきありがとうございます。元の投稿を固定コードで更新しました。 –

関連する問題