代码之家  ›  专栏  ›  技术社区  ›  alexandrul

亚音速3 ActiveRecord生成的代码带有警告

  •  3
  • alexandrul  · 技术社区  · 16 年前

    在将亚音速3与ActiveRecord T4模板一起使用时,生成的代码显示了许多关于CLS合规性、未使用项以及缺少GetHashCode()实现的警告。

    为了避免它们,我做了以下修改:

    // 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 回复  |  直到 16 年前
        1
  •  2
  •   user1228 user1228    16 年前

    目前,消除警告的唯一方法是更新t4模板,并向Rob提交错误/修复。或者等到别人做了。

    Rob所能做的最好的事情可能是提供一个默认的实现,调用一个分部方法,检查结果并在找到结果时返回它。下面是一个例子:

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

    如果没有实现TryGetHashCode就编译了它,编译器将完全忽略对TryGetHashCode的调用,您将从 后果 检查它是否有值(它永远不会有值),因此返回哈希代码的默认实现。

        2
  •  1
  •   Bruce McLeod    16 年前

    因为我们的简单表使用文本作为主键,所以这不是现成的。因此,我对ActiveRecord.tt中第273行附近的模板进行了以下更改

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

    这样会为所有表生成GetHashCode并停止警告,但如果调用,将抛出异常(我们没有这样做)。

    推荐文章