首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检查C#中的运算符是否使用了类的新成员?

检查C#中的运算符是否使用了类的新成员?
EN

Stack Overflow用户
提问于 2019-04-03 12:14:58
回答 2查看 89关注 0票数 0

假设我创建了一个类名"CharacterStat“,它的成员包括health、attack、moveSpeed……并且我覆盖了类的运算符"+,-“。后来,我添加了更多的成员,如装甲和灵巧。有没有办法检查我没有忘记在+,-运算符中实现它们?

EN

回答 2

Stack Overflow用户

发布于 2019-04-03 14:12:49

如果您担心错过向operator+添加新统计信息,并且所有统计信息都属于同一类型,请生成代码而不是编写代码。如果您将其放入.tt文件中(并确保将其的“自定义工具”属性设置为TextTemplatingFileGenerator

代码语言:javascript
复制
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>
namespace Abc
{
    public class CharacterStat{
        <# GenerateBasicStats("attack","health","moveSpeed"); #>
    }
}
<#+
    public void GenerateBasicStats(params string[] statNames)
    {
        //Readonly props
        foreach(var name in statNames){
            WriteLine("public int {0} {{get;}} ",name);
        }

        //Constructor
        Write("public CharacterStat(");
        bool first = true;
        foreach(var name in statNames){
            if(!first) Write(", ");
            first = false;
            Write("int {0}",name);
        }
        WriteLine(")");
        WriteLine("{");
        foreach(var name in statNames){
            WriteLine("this.{0} = {0};",name);
        }
        WriteLine("}");

        //Operator+
        WriteLine("public static CharacterStat operator+(CharacterStat left, CharacterStat right)");
        WriteLine("{");
        Write("return new CharacterStat(");
        first = true;
        foreach(var name in statNames)
        {
            if(!first) Write(", ");
            first = false;
            Write("left.{0} + right.{0}",name);
        }
        WriteLine(");");
        WriteLine("}");
    }
#>

我们生成这个类:

代码语言:javascript
复制
namespace Abc
{
  public class CharacterStat
  {
    public int attack { get; }
    public int health { get; }
    public int moveSpeed { get; }
    public CharacterStat(int attack, int health, int moveSpeed)
    {
      this.attack = attack;
      this.health = health;
      this.moveSpeed = moveSpeed;
    }
    public static CharacterStat operator +(CharacterStat left, CharacterStat right)
    {
      return new CharacterStat(left.attack + right.attack, left.health + right.health, left.moveSpeed + right.moveSpeed);
    }
  }
}

(好吧,没有那么漂亮,但它可以被清理)。现在你不会忘记了,因为添加一个新的stat是在一个地方完成的,它确保它有一个属性,包含在构造函数中,并由operator+覆盖。

更多阅读- Code Generation and T4 Templates

票数 1
EN

Stack Overflow用户

发布于 2019-04-03 13:50:33

不,没有内置的支持来检查“一个类的所有字段是否都在一个给定的方法中使用”。

您的选择:

  • 仔细检查代码,并对您的operator +进行良好的单元测试以使用反射,并显式地收集所有需要进行IL解析器的字段的信息,以便深入研究operator+代码的编译实现,并希望它是以相对重复的方式编写的,以便您能够理解IL。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55486981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档