如何在C#中为类创建简化赋值或默认属性

这是次要的,我知道,但是我要说我有一个班级角色和一个班级能力(主要是因为这就是我正在做的事情). Class Character有六种能力(典型的D& D ……).基本上:
public class Character
{
    public Character()
    {
        this.Str = new Ability("Strength","Str");
        this.Dex = new Ability("Dexterity","Dex");
        this.Con = new Ability("Constitution","Con");
        this.Int = new Ability("Intelligence","Int");
        this.Wis = new Ability("Wisdom","Wis");
        this.Cha = new Ability("Charisma","Cha");
    }

    #region Abilities
    public Ability Str { get; set; }
    public Ability Dex { get; set; }
    public Ability Con { get; set; }
    public Ability Int { get; set; }
    public Ability Wis { get; set; }
    public Ability Cha { get; set; }
    #endregion
}

public class Ability
{
    public Ability()
    {
        score = 10;
    }
    public Ability(string Name,string Abbr)
        : this()
    {
        this.Name = Name;
        this.Abbr = Abbr;
    }

    public string Name { get; set; }
    public string Abbr { get; set; }
    public int score { get; set; }
    public int Mod
    {
        get
        {
            return (score - 10) / 2;
        }
    }
}

在未来的代码中实际使用这些能力属性时,我希望能够认只得分,如下所示:

//Conan hits someone
int damage = RollDice("2d6") + Conan.Str;

//evil sorcerer attack drains strength
Conan.Str = 0;

而不是:

//Conan hits someone
int damage = RollDie("2d6") + Conan.Str.score;

//evil sorcerer attack drains strength
Conan.Str.score = 0;

现在,第一种情况可以通过隐式转换来处理:

public static implicit operator int(Ability a)
{
    return a.score;
}

可以有人帮我反过来吗?这样的隐式转换:

public static implicit operator Ability(int a)
{
    return new Ability(){ score = a };
}

将替换整个属性而不仅仅是属性的分数 – 而不是所需的结果……

解决方法

首先,保持隐式转换:
public static implicit operator Ability(int a)
{
     return new Ability(){ score = a };
}

然后在你的角色类中:为str添加一个private属性,并更改Str属性的getter和setter,如下所示:

private Ability str;
    public Ability Str 
    {
        get
        {
            return this.str;
        }
        set
        {
            if (value.Name == "")
            {
                this.str.score = value.score;
            }
            else
            {
                this.str = value;
            }
        }
    }

你去:)

你也可以使用:

if(string.IsNullOrWhiteSpace(value.Name))

代替

if (value.Name == "")

如果您正在编译.NET 4.0版本

编辑:我给了你一个完全符合你想要的解决方案,但是ja72所写的内容对于操作符来说也是一个很好的建议 – 和;你可以将他的解决方添加到我的(或者我的,无论如何),它会工作得很好.然后你就可以写:

Character Jax = new Character(); // Str.score = 10
        Character Conan = new Character(); // Str.score = 10

        Jax.Str = 2000; // Str.score = 2000;
        Conan.Str += 150; // Str.score = 160

相关文章

C#项目进行IIS部署过程中报错及其一般解决方案_c#iis执行语句...
微信扫码登录PC端网站应用的案例(C#)_c# 微信扫码登录
原文地址:http://msdn.microsoft.com/en-us/magazine/cc163...
前言 随着近些年微服务的流行,有越来越多的开发者和团队所采...
最近因为比较忙,好久没有写博客了,这篇主要给大家分享一下...
在多核CPU在今天和不久的将来,计算机将拥有更多的内核,Mic...