gpt4 book ai didi

c# - 我如何在 C# 中编写这样的代码生成类?

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:45 25 4
gpt4 key购买 nike

我在一个项目中有多个类,除了类的名称外,它们完全相同。基本上,它们代表在运行时从配置文件加载的美化枚举。这些类看起来像这样:

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 添加到数组中即可。

关于c# - 我如何在 C# 中编写这样的代码生成类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2013702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com