C# 仅使用几个不同的参数减少超长构造函数重载的数量

C# 仅使用几个不同的参数减少超长构造函数重载的数量,c#,parameters,constructor,C#,Parameters,Constructor,我制作了自定义界面系统,它使用基本的UI控件,如按钮、标签等。有些控件有很多选项,所以它们使用长构造函数,它们只在一个或两个参数上有所不同。这是正在进行的工作,所以我对可选参数做了很多更改,将更改应用于所有构造函数需要相当长的时间 public Button(string Text, Rectangle Rect, Texture2D Texture, bool moreStuff) public Button(string Text, Point Position, Texture2D Tex

我制作了自定义界面系统,它使用基本的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
来减少构造函数的数量,它编译、运行,目前看起来还可以。但也许我错过了一些东西,以后可能会打破这种方法

要找出作为
动态位置传递的内容
我检查
.GetType().Name
,使用一个开关并在
默认值处引发异常:
,如果它不是可识别的类型

这样做可以吗,还是有更好(更安全或更合适)的方法


目前可以创建一个完全定制的
按钮内联实例,我不想失去这个功能。

这需要一个。这是一个每个参数都有一个属性的类。您的
按钮
构造函数现在只接受一个参数:该参数对象


使用
dynamic
来减少重载的数量肯定不是正确的方法。

这需要一种新的方法。这是一个每个参数都有一个属性的类。您的
按钮
构造函数现在只接受一个参数:该参数对象


使用
dynamic
来减少重载的数量肯定不是正确的方法。

使用
dynamic
在您的场景中并不合适。拥有different构造函数重载并不是一件坏事(不值得滥用
dynamic
关键字)。NET Framework BCL中的许多类都有多个构造函数重载(例如,类有15个contstructor),而有些方法有多个重载以用于不同的用途(例如)。

在您的场景中使用
动态
。拥有different构造函数重载并不是一件坏事(不值得滥用
dynamic
关键字)。NET Framework中的许多类都有多个构造函数重载(例如,类有15个contstructor),有些方法有多个重载以用于不同的用途(例如)。

如果您觉得单调乏味,则无需定义构造函数参数。您可以很好地使用对象初始值设定项:

SomeButton button = new SomeButton()
{
    Text = "",
    MoreStuff = false
};

如果觉得单调乏味,就不需要定义构造函数参数。您可以很好地使用对象初始值设定项:

SomeButton button = new SomeButton()
{
    Text = "",
    MoreStuff = false
};

另一种方法是自己键入:

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 */));

然后在单个构造函数中使用上述类。

另一种方法是自己键入:

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 */));

然后,您只需在单个构造函数中使用上述类。

如果使用对象初始值设定项,则可以独立设置所需的每个单独属性。您只需小心,各种属性可以单独初始化

例如:

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(...)
}
或:


对象初始值设定项表示法是通过其属性初始化对象的理想方法,您可以设置多个需要设置的属性组合。

如果使用对象初始值设定项,则可以单独设置所需的每个属性。您只需小心,各种属性可以单独初始化

例如:

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(...)
}
或:



对象初始值设定项表示法是通过其属性初始化对象的理想方法,您可以设置多个属性组合。

我绝对不会以这种方式使用dynamic;这只会让你的代码变得更糟。只要小心地创建您需要的具有特定类型的构造函数就可以了。也许可以使用params关键字@RickKuipers
params
用于相同类型。。这些不同。。除非他使用
对象
。。但这也将成为未来的噩梦。@RickKuipers尽管我很想让代码更简单,但使用params会严重降低可读性,而且我不知道我在使用哪个构造函数。另一个类的接口只包含一个func,比如:“List GetParams()”我肯定不会以这种方式使用dynamic;这只会让你的代码变得更糟。只要小心地创建您需要的具有特定类型的构造函数就可以了。也许可以使用params关键字@RickKuipers
params
用于相同类型。。这些不同。。除非他使用
对象
。。但这也将成为未来的噩梦。@RickKuipers尽管我想让代码更简单,但使用params会严重降低可读性,而且我不知道我在使用哪个构造函数。另一个类的接口只包含一个func,如:“List GetParams()”,然后该参数类将具有相同的三个(实际上更多)长的构造函数。这些构造函数如此长的原因是我真的希望能够在线创建类实例。@user1306322:我会将此参数对象创建为可变类。然后您可以这样使用它:
new Button(new ButtonParameters{Text=“foo”,Rect=…})
即使您希望使该参数对象不可变,至少Button类的代码会更干净一些,因为它不会包含那么多构造函数。您只是在寻找一种“压缩”的方法吗这三种形式的构造函数参数??我正在寻找一种方法来减少构造函数的数量,同时保持可读性。@user1306322:如果只有一个参数是d