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 回答