1

プロジェクトには、クラスの名前を除いてまったく同じクラスが複数あります。基本的に、これらは実行時に構成ファイルからロードされる栄光の列挙型を表します。クラスは次のようになります。

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

このファイルをコピーしてクラス名を複数回変更する理由はありません。確かに、必要なクラスをリストして、それらを自動的に作成する方法があります。どのように?

4

5 に答える 5

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新しいクラスが必要な場合は、配列に追加するだけです。

于 2010-01-06T14:56:40.027 に答える
3

ジェネリックスで継承を使用できますか?

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> { ... }
于 2010-01-06T15:12:36.113 に答える
2

コードスニペットを検討しましたか?

于 2010-01-06T14:54:39.347 に答える
1

クラスが実際にまったく同じである場合、継承を使用できますか?コードの量はかなり少なく、追加の前処理/後処理は必要ありません。

public class Equatable : IEquatable { ... }

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

:コードスニペットの提案はすべて、何かを変更する必要がある場合、将来のメンテナンスの悪夢になるようです。

于 2010-01-06T15:00:36.527 に答える
0

自分でコードスニペットを作成することをお勧めします。これはすばやく簡単に行えます。

于 2010-01-06T14:55:41.340 に答える