在C#中是否有一种方法可以创建类似于仅在创建对象的新实例时创建的结构?这是一个例子。我希望人们能够分配事件,问题是要分配很多事件,并且通常它们具有相似的功能,仅适用于不同的对象。例如,左按钮事件,右按钮事件等等。我以为我可以用结构组织所有这些但是,当我发现结构被认为是“静态”并且无法访问非结构时,我遇到了障碍 - 静止的成员。是否有任何类型的结构可以让我在C#中执行此操作。
(最终结果应该让我创建一个新对象,并通过这些结构分配给这个对象事件)
MouseObject mouse = new MouseObject();
mouse.Left.PressedEvent += somemethod();
在此示例中,Left不能是结构,因为它在非静态实例中使用。
答案 0 :(得分:4)
为什么不使用另一个班级?
class MouseButton
{
public SomeEvent PressedEvent;
}
class MouseObject
{
public MouseButton Left { get; }
public MouseButton Right { get; }
}
答案 1 :(得分: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!
。
答案 2 :(得分: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;
}