我在项目中有多个类,除了类的名称之外完全相同。基本上,它们代表在运行时从配置文件加载的美化枚举。这些类看起来像这样:
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; }
}
我认为没有理由复制此文件并多次更改类名。当然,有一种方法可以列出我想要的类,并自动为我创建它们。怎么样?
答案 0 :(得分: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
。
答案 1 :(得分: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> { ... }
答案 2 :(得分:2)
您考虑过code snippets吗?
答案 3 :(得分:1)
如果这些类真的完全相同,你可以使用继承吗?代码量非常小,不需要任何额外的前/后处理。
public class Equatable : IEquatable { ... }
public class ClassName1 : Equatable {}
public class ClassName2 : Equatable {}
public class ClassName3 : Equatable {}
public class ClassName4 : Equatable {}
注意:如果您需要更改某些内容,所有代码段建议似乎都会成为维护噩梦。
答案 4 :(得分:0)
我建议你自己创建代码片段,这将是快速而简单的。