どのように私はC#で、このようなクラスをcodegenをすることができますか?
-
19-09-2019 - |
質問
私はクラスの名前以外はまったく同じですプロジェクト内の複数のクラスを持っています。基本的に、彼らは設定ファイルから実行時にロード栄光列挙型を表します。
:クラスは次のようになり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; }
}
私は複数回、このファイルをコピーして、クラス名を変更する理由を見ません。確かに私はちょうど私が何をしたいのクラスリストアップし、それらを自動的に私のために作成することができ方法があります。どのように?
解決
私は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
に追加します。
他のヒント
あなたはジェネリックと継承を使用してもらえますか?
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> { ... }
あなたはコードスニペットを検討しているの?
クラスは本当にまったく同じであれば、
は、あなただけのを継承を使用することができますか?コードの量がかなり少なく、それは余分なプリ/ポスト処理を必要としません。
public class Equatable : IEquatable { ... }
public class ClassName1 : Equatable {}
public class ClassName2 : Equatable {}
public class ClassName3 : Equatable {}
public class ClassName4 : Equatable {}
注:あなたが何かを変更するために必要な場合、彼らは道メンテナンスの悪夢になるようなコードスニペットの提案のすべては思え
。私は迅速かつ簡単になることを、スニペットを自分でコードを作成することをお勧めします。
所属していません StackOverflow