我制作了自定义界面系统,它使用基本的UI控件,如按钮,标签等。有些控件有很多选项,因此它们使用长构造函数,它们只有一个或两个参数不同。这是正在进行的工作,所以我经常更改可选参数,并且需要花费一些时间将更改应用于所有构造函数。
public Button(string Text, Rectangle Rect, Texture2D Texture, bool moreStuff)
public Button(string Text, Point Position, Texture2D Texture, bool moreStuff)
public Button(string Text, Vector2 Position, Texture2D Texture, bool moreStuff)
我尝试使用dynamic
关键字代替Rectangle
,Point
和Vector2
来减少构造函数的数量,并且它编译,工作,并且目前似乎没问题。但也许我错过了一些可能会在以后破坏这种方法的东西?
要查看dynamic Position
传递的内容,我会检查.GetType().Name
,如果它不是可识别的类型,请使用开关并在default:
处抛出异常。
这样做是否可以,或者是否有更好(更安全或更合适)的方式?
目前可以创建Button
内联的完全自定义的实例,我不想失去这种能力。
答案 0 :(得分:3)
如果你觉得它很乏味,你不需要定义构造函数参数。你可以很好地使用对象初始化器:
SomeButton button = new SomeButton()
{
Text = "",
MoreStuff = false
};
答案 1 :(得分:1)
这需要parameter object。这是一个每个参数都有一个属性的类。您的Button
构造函数现在只接受一个参数:该参数对象。
使用dynamic
来减少重载次数绝对不是正确的方法。
答案 2 :(得分:0)
在您的方案中使用dynamic
并不合适。具有不同的构造函数重载并不是一件坏事(不值得滥用dynamic
关键字)。 .NET Framework BCL中的许多类都有几个构造函数重载(例如,FileStream
类有15个contstructors),有些方法有几个重载用于不同的用法(例如MessageBox.Show
)。
答案 3 :(得分:0)
另一种方法是自己输入:
class YourPositioningType {
public int X { get; set; }
public int Y { get; set; }
public static YourPositioningType FromVector(Vector2 vector) {
return new YourPositioningType() { X = vector.X, Y = vector.Y };
}
public static YourPositioningType FromRectangle(Rectangle rect) {
// etc..
}
}
从上述每种类型转换的静态方法。然后你会把它称为:
Button b = new Button("Blah", YourPositioningType.FromVector(new Vector2() { /* etc */));
然后你只需在一个构造函数中使用上面的类。
答案 4 :(得分:0)
如果您使用对象初始值设定项,则可以单独设置所需的每个属性。您必须要小心,可以独立初始化各种属性。
例如:
public class Button
{
public int Width
{
get
{
return Rectangle.Width;
}
set
{
Rectangle.Width = value;
}
}
public int Height
{
get
{
return Rectangle.Height;
}
set
{
Rectangle.Height = value;
}
}
public int X
{
get
{
return Rectangle.Left;
}
set
{
Rectangle.Left = value;
}
}
public int Y
{
get
{
return Rectangle.Top;
}
set
{
Rectangle.Top = value;
}
}
public Rectangle Rectangle
{
get;
set;
}
}
如果你有类似上面的课程,你可以这样做:
var button = new Button
{
Rectangle = new Rectangle(...)
}
或:
var button = new Button
{
Left = 0,
Top = 0,
Width = 100,
Height = 20
}
对象初始值表示法非常适合通过其属性初始化对象,您可以在其中设置多个需要设置的属性组合。