【问题标题】:C# Dynamically cast object for property gridC# 为属性网格动态转换对象
【发布时间】:2013-11-02 13:37:59
【问题描述】:

我有一个名为 Widget 的父类。我有一个我存储的小部件列表。在此列表中,我存储 Widget 的子项,例如 Button、Label、DropDown 等。当在我的编辑器中选择一个子项时,我将该对象(在 Widgets 列表中按名称查找)分配给 PropertyGrid。但是,由于它们存储为 Widget 类型,因此 PropertyGrd 仅显示 Widget 属性。 当我将子小部件设置为 PropertyGrid 时,我想将其转换为它的实际类型,以便 PropertyGrid 可以看到孩子的属性,但我想动态执行此操作而不是使用 if/case 语句,因为子小部件使用插件系统,所以我在设计时不知道类型是什么。我知道我必须使用反射,我很好,但我只是不知道该怎么做。

由于我将我的子小部件存储在父小部件的容器中,因此子小部件将被存储为小部件,不是吗?意味着 PropertyGrid 只能看到 Widget 属性?

Dictionary<string, Widget> Widgets;

Widgets.Add("button1", new Button());  // gets converted to parent Widget

PropGrid.SelectedObject = Widgets["button1"];


public class Button : Widget.Widget
{
    public String Test { get; set; } // this doesn't show up in the property grid
}

【问题讨论】:

  • 请提供一些代码。
  • 您能否展示一个未显示的示例属性?如果您的代码与蒂姆的答案中显示的一样,它应该已经可以工作了——所以一个例子会有所帮助。另外:这是winforms吗?吗?还是……?
  • @MarcGravell PropertyGrid 是一个 winforms 类。我已经添加了那个标签。
  • @Tim 还有 wpf 实现,iirc(第 3 方) - 我假设 winforms,但想确定

标签: c# winforms


【解决方案1】:

我假设你有一些这样的代码:

myPropertyGrid.SelectedObject = widget;

由于SelectedObject 属性的类型为object,因此无论您是否为其分配一个静态称为objectWidgetButton 的对象都没有关系:它将被采用作为object。由于其他原因,您的子属性没有出现。

【讨论】:

  • 但我正在存储我的对象,例如 Dictionary Widgets;因此,例如,当我添加一个按钮时,它被存储为一个小部件,因为我这样做了: Widgets.Add("button1", new Button());因此,当它存储在容器中时,它被转换为 Widget,这意味着当我将其拉出时,它仍然是 Widget 类型,不是吗?这就是它在 C++ 中的工作方式,所以我认为 C# 也是如此。
  • @user441521 当您将其拉出而不进行强制转换时,其静态已知类型(编译器知道的类型,您可以在将鼠标悬停在widget 上时看到)为Widget ,但它的运行时类型(您可以使用widget.GetType() 等查看)实际上是Button。根据您的描述,听起来 C++ 在这方面有所不同:运行时没有铸造容器显示“这是一个按钮,但我将它用作小部件”。
  • 只是为了 100% 清楚:在 .net 中,您将其分配为类型 object;它将在运行时使用 GetType 和 TypeDescriptor 等来理解对象。
  • 你是对的。我忘记构建动态加载时将其放入插件文件夹的按钮 dll。我现在看到了属性。对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2017-08-20
  • 2012-10-21
  • 2013-05-15
  • 1970-01-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多