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
参数的静态回调(其内部实现如上所示),或者允许属性名(包括索引器)要包含点[so
var 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);