C# 如何使自定义矩形属性与相应的struct';谁的财产?
我的类中有一个C# 如何使自定义矩形属性与相应的struct';谁的财产?,c#,properties,struct,C#,Properties,Struct,我的类中有一个Rectangle属性,我想让它正确地接受Width和Height,并返回它们,就像我处理的是一个普通的矩形 Vector2 position; Rectangle rectangle; public Rectangle Rect { get { return rectangle; } set { rectangle = value; position.X = value.X; position.Y = value.Y; } }
Rectangle
属性,我想让它正确地接受Width
和Height
,并返回它们,就像我处理的是一个普通的矩形
Vector2 position;
Rectangle rectangle;
public Rectangle Rect
{
get { return rectangle; }
set { rectangle = value; position.X = value.X; position.Y = value.Y; }
}
看起来不错,效果很好。除非您想获取或设置Width
或X
如何实现这一点?如果您的类的语义是这样的,您可以100%确定您永远不会在意外部人员调整
Rect
,只需将其作为字段公开,调用者就可以直接设置其字段。如果您不能保证,那么您可以考虑提供一种方法,将代码< >矩形> /代码>传递给回调方法:。
delegate void ActionByRef<T1>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2>(ref T1 p1, ref T2 p2);
delegate void ActionByRef<T1,T2,T3>(ref T1 p1, ref T2 p2, ref T3 p3);
void ActOnRect(ActionByRef<Rectangle> proc)
{ proc(ref rectangle); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1)
{ proc(ref rectangle, ref p1); position.X = value.X; position.Y = value.Y; }
void ActOnRect<TP1,TP2>(ActionByRef<Rectangle,TP1> proc, ref TP1 p1, ref TP2 p2)
{ proc(ref rectangle, ref p1, ref p2); position.X = value.X; position.Y = value.Y; }
我建议的最后一种方法是遵循
Control.SetBounds
的模式,它包括一个重载,将矩形
成员作为单独的参数,但是需要一个额外的参数,它指定哪些参数应该复制到Bounds
的相应成员,我想我必须使用Bounds
。谢谢在许多情况下,这是一个好方法。回调方法具有更好的语义,但编译器还不允许使用好的语法。实际上,我真正希望看到的是支持将Thing.Rect.X
识别为Thing
的一部分,或者让编译器自动生成带有ref
参数的静态回调(其内部实现如上所示),或者允许属性名(包括索引器)要包含点[sovar r=myThing.Rect
将调用Rect
的属性getter,但是myThing.Rect.X=3
将调用名为Rect.X
的myThing
属性的属性设置器。歧义可以通过以下方式解决:除非绑定时的表达式是合法的,否则虚线属性名称将优先,因此var i=
myThing.Rect.X`将调用Rect.X
[如果存在]的属性getter,但var i=(myThing.Rect).X
将调用Rect
的属性getter(这将复制整个结构),然后访问该结构上的X
。当我尝试将public int X{get;set;}
放入public Rectangle{(此处){get;set;}}}
中时,我感到惊讶,但它不起作用。看起来很像C,但不幸的是,还没有实现。
var r = myThing.Rect;
r.X = 23;
myThing.Rect = r; // Or perhaps myThing.SetRect(R);