2012-07-07 62 views
-2

在C#中是否有一种方法可以创建类似于仅在创建对象的新实例时才创建的结构?这是一个例子。我希望人们能够分配事件,问题是有很多要分配的事件,并且通常它们具有类似的功能,只是针对不同的对象。例如,左键按下事件,右键按下事件等等。我认为我可以用结构组织所有这些,但是当我发现结构被认为是“静态”并且无法访问非结构时,我遇到了一个障碍静态成员。有没有什么结构可以让我在C#中做到这一点。C#组织变量?

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

MouseObject mouse = new MouseObject(); 

mouse.Left.PressedEvent += somemethod(); 

在这个例子中左不可能是一个结构,因为它是在非静态使用实例。

+4

你的问题很困惑(或混淆)。结构不被认为是静态的 - 事实上,这个概念甚至没有意义。你的代码当然可以被编译,尽管这不是一个好主意。我看不出在这里使用结构的理由 - 您应该真正了解结构和类之间的差异。 – 2012-07-07 14:32:46

+1

当你感到“结构是静态的”时,你是否在你的'MouseObject'类中定义了'Left'结构?如果你真的创建了你的结构的一个实例,它将不会是“静态的”(除非你使用'static'关键字定义实例)。 – 2012-07-07 14:35:18

回答

4

为什么不使用其他课程?

class MouseButton 
{ 
    public SomeEvent PressedEvent; 
} 

class MouseObject 
{ 
    public MouseButton Left { get; } 
    public MouseButton Right { get; } 
} 
+0

我不知道我是如何错过这个的,我试图把我的结构放入MouseObject类中。 DERP。谢谢您的帮助。 – redcodefinal 2012-07-07 14:39:31

0

Mutable structs are evil。如果你使用结构体,如下所示,它会运行,但PressedEvent从来没有得到我的处理程序,大概是因为我正在修改的结构不是真的在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!

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; 
} 
+0

是的就是这样。我不完全确定为什么我认为这会起作用。 – redcodefinal 2012-07-07 20:03:15