-2

在 C# 中,有没有办法制作类似于仅在创建对象的新实例时才创建的结构?这是一个例子。我希望人们能够分配事件,问题是有很多事件要分配,而且它们通常具有相似的功能,只是针对不同的对象。例如,左键按下事件、右键按下事件等。我以为我可以用结构组织所有这些,但是当我发现那些被认为是“静态”的结构并且无法访问非-静态成员。是否有任何结构可以让我在 C# 中执行此操作。

(最终结果应该让我创建一个新对象,并通过这些结构分配给这个对象事件)

MouseObject mouse  = new MouseObject();

mouse.Left.PressedEvent += somemethod();

在此示例中,Left 不能是结构,因为它用于非静态实例。

4

3 回答 3

4

为什么不使用另一个类?

class MouseButton
{
    public SomeEvent PressedEvent;
}

class MouseObject
{
    public MouseButton Left { get; }
    public MouseButton Right { get; }
}
于 2012-07-07T14:33:59.287 回答
0

可变结构是邪恶的。如果你使用 struct 来制作它,如下所示,它会运行,但PressedEvent永远不会得到我的处理程序,大概是因为我正在修改的 struct 不是真正在MouseObject. 去上课,就像@japreiss 的解决方案一样。

struct MouseButton
{
    internal void OnPressed()
    {
        if (PressedEvent != null)
            PressedEvent(this, EventArgs.Empty);
    }
    public event EventHandler PressedEvent;
    public event EventHandler ReleasedEvent;
}
class MouseObject
{
    public MouseButton Left { get; private set; }
    public MouseButton Right { get; private set; }
    public void OnLeftPressed()
    {
        Left.OnPressed();
    }
}
static void Main(string[] args)
{
    var m = new MouseObject();
    m.Left.PressedEvent += (s, e) => Console.WriteLine("pressed");
    m.OnLeftPressed();
}

这打印it was null!

于 2012-07-07T14:36:06.280 回答
0

我猜这是您使用的代码。

public class MouseObject
{
    public struct Left
    {
        public event EventHandler PressedEvent;
    }
}

在这种情况下,Left不是 MouseObject 的成员。它只是另一种类型。这种封装的行为很像命名空间。

你可能想要的是这样的:

public class MouseObject
{
    public MouseButton Left { get; set; }

    // Left still needs to be intialized, preferably in the constructor
}

public class MouseButton
{
    public event EventHandler PressedEvent;
}
于 2012-07-07T14:39:57.543 回答