2009-07-06 15 views
3

ActiveRecord T4テンプレートでSubSonic 3を使用している間、生成されたコードには、CLS準拠、未使用アイテム、およびGetHashCode()の実装に関する多くの警告が表示されます。SubSonic 3 ActiveRecordによる警告付きのコード

それらを避けるために、私は以下の修正をしました:

// Structs.tt 
[CLSCompliant(false)]         // added 
public class <#=tbl.CleanName#>Table: DatabaseTable 
{ ... 

// ActiveRecord.tt 
[CLSCompliant(false)]         // added 
public partial class <#=tbl.ClassName#>: IActiveRecord 
{ 
    #region Built-in testing 
    #pragma warning disable 0169       // added 
    static IList<<#=tbl.ClassName#>> TestItems; 
    #pragma warning restore 0169       // added 
    ... 

    public override Int32 GetHashCode()     // added 
    { 
     return this.KeyValue().GetHashCode(); 
    } 

    ... 

は、警告を取り除くために良い方法はありますか?または、より良いGetHashCode()の実装ですか?

答えて

2

は現在、警告を取り除くための唯一の方法は、あなたのT4テンプレートを更新し、バグを提出/ロブに修正することです。他の人がやるまで待ってください。

は、GetHashCodeメソッドの実装については、私はあなたがテンプレートを介してこれを行うには良い方法を見つけるつもりだとは思いません。ハッシュコードの生成は、オブジェクトに含まれる状態に大きく依存します。そして、名前の後にたくさんの手紙を書いた人は、長くて、衝突の可能性の低い速い結果を返すハッシュコードアルゴリズムを思い付くのが難しい。それを保持する可能性のある状態の何百万もの異なる順列を持つクラスを生成する可能性のあるテンプレート内でこれを行うことは、満たすために難しいことです。

おそらくロブが行われている可能性が最善のことは、部分的な方法に声をかけ、結果を確認し、見つかった場合は、それを返すデフォルトの実装を提供するだろう。 、あなたはTryGetHashCodeの実装せずにこれをコンパイルする場合、コンパイラは完全にTryGetHashCodeへの呼び出しを省略して、あなたはそれが価値があるかどうかをチェックするために結果の宣言から行く

public partial class Foo 
{ 
    public override int GetHashCode() 
    { 
     int? result = null; 
     TryGetHashCode(ref result); 
     if (result.HasValue) 
      return result.Value; 
     return new Random().Next(); 
    } 

    partial void TryGetHashCode(ref int? result); 
} 

public partial class Foo 
{ 
    partial void TryGetHashCode(ref int? result) 
    { 
     result = 5; 
    } 
} 

た:ここでは例です決して実行されないので、ハッシュコードのデフォルトの実装が返されます。

+0

+1コードサンプルをありがとう、私はこの方法で部分的な方法を使用する前に試みたことはありません。 – alexandrul

1

私はこれについても迅速な解決策を望んでいました。私が使用しているバージョンでは、単一のintである主キーを持つテーブルに対してGetHashCodeが生成されます。私たちの簡単な表として

が、これは箱から出して動作しませんでした彼らの主キーとしてテキストを使用します。だから私はActiveRecord.tt

<#  if(tbl.PK.SysType=="int"){#> 

     public override int GetHashCode() { 
      return this.<#=tbl.PK.CleanName #>; 
     } 
<#  }#> 
<#  else{#> 
     public override int GetHashCode() { 
      throw new NotImplementedException(); 
     } 
<#  }#> 

この方法のGetHashCodeメソッドは、すべてのテーブルのために生成され、警告を停止している中でライン273に近いテンプレートに以下の変更をしたが、呼び出された場合(私たちはされていない例外がスローされます)。

これはテストアプリケーション用であり、ウェブサイトなどではなく、このアプローチは多くの状況で有効ではない可能性があります。

+0

+1 int/bigintプライマリキーのみを持つ古いアプリケーションがあります。この素晴らしいソリューションはうまくいくかもしれません。 – alexandrul