2010-01-06 48 views
1

我有一个项目中的多个类,除了类的名称完全相同。基本上,它们表示从配置文件在运行时加载的荣耀枚举。这些类看起来像这样:我如何在C#中像这样使用codegen类?

public class ClassName : IEquatable<ClassName> { 
    public ClassName(string description) { 
     Description = description; 
    } 

    public override bool Equals(object obj) { 
     return obj != null && 
      typeof(ClassName).IsAssignableFrom(obj.GetType()) && 
      Equals((ClassName)obj); 
    } 

    public bool Equals(ClassName other) { 
     return other != null && 
      Description.Equals(other.Description); 
    } 

    public override int GetHashCode() { 
     return Description.GetHashCode(); 
    } 

    public override string ToString() { 
     return Description; 
    } 

    public string Description { get; private set; } 
} 

我看不到任何理由复制此文件并更改类名称多次。当然,有一种方法可以列出我想要的课程并让它们自动为我创建。怎么样?

+1

为什么会不正常类继承的工作?那么你会重复的唯一的东西就是构造函数。 – David 2010-01-06 14:55:49

+0

我不想像这样的一种类型的类与这样的另一种类的类相比。继承可以处理GetHashCode,ToString和Description,但不能等于。 – 2010-01-06 14:57:29

+0

我并不是说这特别适用于你的情况,但是,任何时候我想“我怎样才能快速复制这个X次”,就会引发一个大红旗,让我重新考虑我的设计。通常,我尝试删除重复而不是自动化。 – 2010-01-06 15:20:28

回答

12

我建议使用T4。这段代码片段的一个重要优点是,如果你改变你的模板,那么你的所有代码都会被更新以匹配。

与扩展.tt

<#@ template language="C#" #> 
<#@ output extension=".codegen.cs" #> 
<#@ assembly name="System.dll" #> 
<#@ import namespace="System" #> 
// <auto-generated> 
// This code was generated by a tool. Any changes made manually will be lost 
// the next time this code is regenerated. 
// </auto-generated> 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace MyStuff 
{ 
<# foreach (string classname in classes) {#> 
    public class <#= classname #> : IEquatable<ClassName> 
    { 
      public <#= classname #>(string description) { 
     Description = description; 
    } 

    public override bool Equals(object obj) { 
     return obj != null && 
      typeof(<#= classname #>).IsAssignableFrom(obj.GetType()) && 
      Equals((<#= classname #>)obj); 
    } 

    public bool Equals(<#= classname #>other) { 
     return other != null && 
      Description.Equals(other.Description); 
    } 

    public override int GetHashCode() { 
     return Description.GetHashCode(); 
    } 

    public override string ToString() { 
     return Description; 
    } 

    public string Description { get; private set; } 
    } 
    } 

<# } #> 
} 

<#+ string[] classes = new string[] { "Class1", 
             "Class2" }; 
#> 

将这个文件中的VS会为你生成一个源文件。当你需要一个新班级时,只需加入classes

+0

支持通过任何机会表达? – 2010-01-06 15:04:42

+0

如果T4会让VS为你生成源文件,我将不得不停止使用我的自制C#工具来创建简单的代码文件! Thx例如Craig – 2010-01-06 15:05:10

+1

丹尼尔,是的,你可以在Express中做一些配置。看到这个问题:http://stackoverflow.com/questions/786734/subsonic-asp-net-mvc-sample-in-visual-web-developer-express – 2010-01-06 15:08:18

0

我建议你自己创建代码段,这将是快速和容易的。

1

如果这些类真的是完全一样的,你可以使用继承?代码量非常小,并且不需要任何额外的前/后处理。

public class Equatable : IEquatable { ... } 

public class ClassName1 : Equatable {} 
public class ClassName2 : Equatable {} 
public class ClassName3 : Equatable {} 
public class ClassName4 : Equatable {} 

注意:所有的代码片段建议看起来他们会是一个维护的噩梦在路上,如果你需要改变一些东西。

2

你可以使用继承与泛型?

public class MyBase<T> : IEquatable<MyBase<T>> 
    where T : MyBase 
{ 
    public ClassName(string description) { 
     Description = description; 
    } 

    public override bool Equals(object obj) { ... } 

    public bool Equals(T other) { 
     return other != null && 
      Description.Equals(other.Description); 
    } 

    public override int GetHashCode() { ... } 

    public override string ToString() { ... } 

    public string Description { get; private set; } 
} 

然后,你可以继承这样的:

public class ClassName1 : MyBase<ClassName1> { ... } 
public class ClassName2 : MyBase<ClassName2> { ... } 
public class ClassName3 : MyBase<ClassName3> { ... } 
相关问题