gpt4 book ai didi

c# - 生成许多​​与 float (System.Single) 具有相同功能的结构类型

转载 作者:行者123 更新时间:2023-11-30 16:39:09 25 4
gpt4 key购买 nike

我创建了一个代码库,其中我严重依赖 float 结构。但是 float 可以意味着任何东西。秒、米、弧度、千克、米/秒、弧度/秒等……正确命名会有所帮助,但仍然很容易混淆。所以我开始为每个单元编写包装 float 的结构。但是编写以下结构变得越来越麻烦:

  • 存储它们的基础浮点值
  • 他们所有的运营商(<、<=、>、>=、==、!=、-、+、*、/)
  • 适当的 Equals、GetHashCode 和 ToString 方法
  • IEquatable接口(interface)的实现

生成此类结构的最简单方法是什么,这样我就不必维护那么多代码了?

奖励问题:通过这种方式,我仍然能够添加一些特殊运算符。例如,我想添加一个运算符,将 Meters/Seconds 转换为 MetersPerSecond

编辑:我使用的是 .Net Framework 4.7 和 C# 语言级别 7.3

这是我的示例 Seconds 结构。正如您想象的那样,Meters 结构看起来完全一样。

public struct Seconds : IEquatable<Seconds>
{
public Seconds(float value)
{
this.Value = value;
}

public float Value { get; }

public static implicit operator Seconds(float value) => new Seconds(value);

public static implicit operator Seconds(TimeSpan value) => new Seconds((float)value.TotalSeconds);

public static Seconds operator +(Seconds a, Seconds b) => new Seconds(a.Value + b.Value);

public static Seconds operator -(Seconds a, Seconds b) => new Seconds(a.Value - b.Value);

public static bool operator >(Seconds a, Seconds b) => a.Value > b.Value;

public static bool operator <(Seconds a, Seconds b) => a.Value < b.Value;

public static bool operator >=(Seconds a, Seconds b) => a.Value >= b.Value;

public static bool operator <=(Seconds a, Seconds b) => a.Value <= b.Value;

public static bool operator ==(Seconds a, Seconds b) => a.Equals(b);

public static bool operator !=(Seconds a, Seconds b) => !a.Equals(b);

public override int GetHashCode() => this.Value.GetHashCode();

public override bool Equals(object obj)
{
if (obj is Seconds)
{
return this.Equals((Seconds)obj);
}

return false;
}

public bool Equals(Seconds other) => other.Value == this.Value;

public override string ToString() => $"{this.Value.ToString("F2", CultureInfo.InvariantCulture)}s";
}

最佳答案

如果您想继续使用 C#,可以使用简单的 Yellicode用于生成样板代码的模板(使用一些 TypeScript)。这是一个生成部分结构的模板 (struct-types.template.ts)。

import { Generator, TextWriter } from '@yellicode/templating';
import { CSharpWriter } from '@yellicode/csharp';

var structNames = ['Seconds', 'Meters']; // add more names here

Generator.generate({ outputFile: './structs.cs' }, (output: TextWriter) => {
var csharp = new CSharpWriter(output);
structNames.forEach(structName => {
const struct: StructDefinition = { name: structName, accessModifier: 'public', isPartial: true, implements: [`IEquatable<${structName}>`] } as StructDefinition;
csharp.writeStructBlock(struct, () => {
// Ctor
csharp.writeMethodBlock({ isConstructor: true, name: structName, accessModifier: 'public', parameters: [{ typeName: 'float', name: 'value' }] }, () => {
csharp.writeLine('this.Value = value;');
});
csharp.writeLine();
// Value
csharp.writeAutoProperty({ typeName: 'float', name: 'value', accessModifier: 'public', hasGetter: true });
csharp.writeLine();
// Operators
csharp.writeLine(`public static implicit operator ${structName}(float value) => new ${structName}(value);`);
csharp.writeLine();
// ... other operators omitted for brevity, type-specific conversion operators would be in a partial file
// Methods
csharp.writeLine('public override int GetHashCode() => this.Value.GetHashCode();');
csharp.writeLine();
// ... other methods omitted for brevity
})
csharp.writeLine();
})
});

配置文件 (codegenconfig.json) 应如下所示:

{
"compileTypeScript": true,
"templates": [
{
"templateFile": "struct-types.template.ts"
}
]
}

快速启动(确保安装了 NPM,然后打开命令提示符):

  1. npm install @yellicode/cli -g
  2. 使用上述文件创建目录并运行 npm init -y
  3. npm install --save-dev @yellicode/templating @yellicode/csharp
  4. 运行 yellicode --watch 生成您的代码。

如果您希望每个结构都有一个单独的输出文件,请从 structNames.forEach(.. 循环开始并为每个结构调用 Generator.generate(... .

关于c# - 生成许多​​与 float (System.Single) 具有相同功能的结构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526430/

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