我有一个C#基类,我将信息与每个类型(而不是每个实例)相关联。基本上我希望所有子类都显示一个Icon和一个表示该类型的FriendlyName。我想不必须创建一个类型实例来获取此信息,我想要求所有子类提供此信息。理想情况下,它将位于基础派生的接口中。
我尝试使用类属性,但它需要一个常量值,所以虽然我可以设置FriendlyName,但是我无法设置Icon,而且我无法找到一种方法来生成所需的属性,所以没有它的儿童班可以逃脱(直到运行时)。
我在子基础上添加了一个静态属性,孩子们可以隐藏,但这有点难看,基础的值真的是荒谬的。它无法知道孩子的名字是什么。我可以在属性中进行基础投掷,但是再次,直到运行时才会被捕获。
任何人对我如何实现这样的事情都有任何想法?我缺少一种模式吗?任何开箱即用的想法都会受到鼓励。
编辑:我真的需要能够在继承树中要求类属性,并能够使用嵌入式资源来设置这些属性。将返回的所有信息都是静态的并且在编译时是已知的。我只是想办法很好地暴露它。
编辑2:以下是我需要的更具体的例子:
我们假设我有一个基类:
abstract class Vehicle { ... }
然后我有两个孩子:
class Car : Vehicle { ... }
class Truck : Vehicle { ... }
我希望能够获得一个代表“汽车”或“卡车”的图标,而不必创建一个实例(一个la Car.Icon),因为给定类型的所有车辆都将拥有相同的图标。
我还想确保所有来自车辆的类型以相同的方式获取此图标,以防将来有人出现并添加新类
class Airplane : Vehicle { ... }
编辑3:我为什么需要这个?好吧,我们有一个可以插入插件的应用程序。插件由类型定义,当加载类型时,我们向用户显示图标和名称。当他们单击该图标时,它会创建该类型的实例(并为他们提供一个用于命名实例的对话框等)。我不需要或者不想创建该类型的实例来获取图标。
答案 0 :(得分:1)
如果你想绝对要求孩子实现这个,那么我认为这样做的唯一方法是使基类抽象,并公开实例属性以返回图标和友好名称。
这些是抽象的,而不是虚拟的,因此您可以通过派生类强制执行。我知道它不干净,因为它是更好地存储在类型级别的信息,但它是我可以看到在编译时强制执行此要求的唯一方法。
答案 1 :(得分:1)
我认为您可能错过的一点是,您无法覆盖静态属性,这是因为当您编写代码来调用它时,您没有实例,因此编译器将会在那个时候静态链接它 - 如果你需要多态性,你需要使用运行时的实例来确定要调用哪个版本的方法。
编辑:(回复您的EDIT2)
您希望从哪个场景调用此内容?
如果您想要针对某个实例显示您的图标,那么您有一个实例,那么为什么不将它作为实例上的属性(因为,毕竟有人可能会覆盖您的Car
创建一个SportsCar
并想要一个不同的图标) - 实际上你要求你的对象属性,虽然它与概念模型匹配(所以它不是轮子的数量,最大速度,等;但是可以向最终用户显示它的东西)
EDIT2:(回应您的EDIT3)
我要做的方法是使用属性来识别哪个嵌入式资源用作相应类型的图标(因此您不需要实例),并使用反射来读取值。您可以定义自己的自定义属性,或查看可能使用的ToolboxItemAttribute。
答案 2 :(得分:0)
也许您可以做的是定义一个属性,用于在插件系统中注册该对象。
这样,您将强制类的开发人员分配属性,以便在插件系统中工作。
也许您可以使用像ToolboxBitmapAttribute这样的方法,您可以在其中设置找到您的dll资源的图像。