-1

我的项目对象的 OnBuy 和 OnSell 有一个委托,问题是我要复制粘贴一些项目,而不是修改每个 OnBuy 和 OnSell 的关键字名称,并尝试使用“this”关键字,我已经添加我对项目类的函数,但在复制粘贴后如果不修改对象名称仍然无法访问它。这是我的代码:

        public static Item item = new Item
        {
            Name = "Item",
            ID = 1,
            Price = 50,
            Info = "Awesome!",
            OnBuy = delegate(Client cli)
            {
                // Invalid
                this.BuyTitle(cli);

                // Still can't change
                this.Name = "AAA";

                return true;
            },
            OnSell = delegate(Client cli)
            {
                // Invalid
                this.SellTitle(cli);

                // Still can't change
                this.Name = "AAA";

                return true;
            }
         }

这是项目类:

    public class Item
    {
        public string Name { get; set; }

        public int ID { get; set; }

        public int Price { get; set; }

        public string Info { get; set; }

        public Func<Client, bool> OnBuy { get; set; }

        public Func<Client, bool> OnSell { get; set; }

        public bool BuyTitle(Client cli)
        {
            ...
        }

        public bool SellTitle(Client cli)
        {
            ...
        }
    }
4

1 回答 1

2

您正在使用对象初始值设定项语法来创建Item. 匿名委托无法使用this,因为对象初始化程序无法引用它正在创建的对象。从 C# 规范的第 7.6.10.2 节:

对象初始化器不可能引用它正在初始化的新创建的对象。

我不确定委托是这里最合适的机制,但如果您仍想使用它们,我将创建一个静态方法来创建项目并调用它来初始化静态字段。

以下是您可以执行的操作的概述:

public static Item item = CreateItem();

private static Item CreateItem()
{
    var item = new Item() { Name = "Item" };
    item.OnBuy = client => { item.OnBuy(client); item.Name = "AAA" };
    return item;
}
于 2013-11-02T18:59:15.950 回答