1

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

要找出在dynamic Position我检查时传递了什么,请使用开关并在它不是可识别的类型.GetType().Name时抛出异常。default:

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


目前可以创建一个完全自定义的Button内联实例,我不想失去这种能力。

4

5 回答 5

3

如果你觉得它很乏味,你不需要定义构造函数参数。您可以很好地使用对象初始化程序:

SomeButton button = new SomeButton()
{
    Text = "",
    MoreStuff = false
};
于 2013-02-16T11:34:38.003 回答
1

这需要一个参数对象。这是一个每个参数都有一个属性的类。你的Button构造函数现在只需要一个参数:那个参数对象。

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

于 2013-02-16T11:32:01.350 回答
0

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

于 2013-02-16T11:32:10.250 回答
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 */));

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

于 2013-02-16T11:35:25.973 回答
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
}

对象初始化符号非常适合通过其属性初始化对象,您可以在其中设置多个需要设置的属性组合。

于 2013-02-16T11:48:48.043 回答