我正在为MonoGame项目开发UI系统。

我创建了一个称为UserInterface的大类。在该类内部,有嵌套的类,例如ButtonCheckboxScrollbar等,它们都从一个称为UIObject的基类继承。 UI上的每个对象都存储在称为System.Collections.Generic.List<UIObject>的专用canvas中。

使用此类的程序员可以使用公共方法UserInterface.Add(string name, UIObject obj)轻松地将新对象添加到画布。当程序员将对象添加到画布时,他们为其分配一个名称,以便可以在列表中找到它。

当我尝试创建将返回具有特定名称的对象的公共方法时,出现了我的问题。

我的尝试看起来像这样:

public UIObject GetObject(string nameOfObject)
{
    return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject);
}


问题:此方法返回的对象始终是UIObject,而不是原始对象所属的继承类。这意味着它无法访问所述原始类的属性。例如,如果我想检查是否按下了画布上的Button,则可以执行以下操作:

UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());

if (ui.GetObject("nameOfButton").IsPressed)
{
    // Do stuff
}


但是,这将不起作用,因为属性IsPressed属于Button类,并且返回的对象是UIObject

如何使用原始类型从画布返回对象?

解决了:
非常感谢Austin Brunkhorst向我介绍了仿制药!

工作方式:

public T GetObject<T>(string nameOfObject) where T : UIObject
{
    return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject) as T;
}


方法的调用方式如下:

UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());

if (ui.GetObject<Button>("nameOfButton").IsPressed)
{
    // Do stuff
}

最佳答案

您需要将UIObject强制转换为要使用的类型。在这种情况下,Button

Button slickButton = (Button)ui.GetObject("nameOfButton");


小心!如果对象实际上不是Button,则将引发异常。

或者,您可以使用as运算符,如果对象不是null,则该运算符的值为Button

Button slickButton = ui.GetObject("nameOfButton") as Button;


我建议您研究泛型,因为您可以通过明确说明期望的类型并让该方法为您解决问题来避免这种情况。

Button slickButton = ui.GetObject<Button>("nameOfButton");


Casting Reference

关于c# - 返回从基类继承的嵌套类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47842880/

10-11 02:11