我有一个OnBuy和OnSell委托我的items对象,问题是我要复制粘贴一些项目,而不是修改每个OnBuy和OnSell的关键字名称,并尝试使用“this”关键字,我已经将我的函数添加到item类中,但是在复制粘贴后不修改对象名称仍然无法访问它。这是我的代码:
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)
{
...
}
}
答案 0 :(得分: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;
}