2010-01-06 52 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> { ... } 
相關問題