提供inheritance的静态属性(从概念上讲)

我有一个C#基类,我将信息与每个类型(而不是每个实例)相关联。 基本上我希望所有子类都显示一个Icon和一个表示该类型的FriendlyName。 我不想创建一个类型实例来获取这些信息,我想要求所有子类提供此信息。 理想情况下,它将位于基础派生的接口中。

我试图使用类属性,但它需要一个常量值,所以虽然我可以设置FriendlyName,但我无法设置Icon,我无法看到一种方法来使所需的属性,所以子类可以没有它(直到运行时间)。

我在子基础上添加了一个静态属性,孩子们可以隐藏,但这有点难看,基础的值真的是荒谬的。 它无法知道孩子的名字是什么。 我可以在属性中进行基础投掷,但是再次,直到运行时才会被捕获。

任何人对我如何实现这样的事情都有任何想法? 我缺少一种模式吗? 任何开箱即用的想法都会受到鼓励。

编辑:我真的需要能够在inheritance树中要求类属性并能够使用嵌入式资源来设置这些属性。 将返回的所有信息都是静态的并且在编译时是已知的。 我只是无法找到一种方法来很好地暴露它。

编辑2:这是我需要的更具体的例子:

我们假设我有一个基类:

abstract class Vehicle { ... } 

然后我有两个孩子:

 class Car : Vehicle { ... } class Truck : Vehicle { ... } 

我希望能够获得一个代表“汽车”或“卡车”的图标,而不必创建一个实例(一个la Car.Icon),因为给定类型的所有车辆都将具有相同的图标。

我还想确保所有来自车辆的类型以相同的方式显示以获取此Icon,以防将来有人出现并添加新类

 class Airplane : Vehicle { ... } 

编辑3:为什么我需要这个? 好吧,我们有一个可以插入插件的应用程序。 插件由类型定义,当加载类型时,我们向用户显示图标和名称。 当他们单击该图标时,它会创建该类型的实例(并为他们提供一个用于命名实例的对话框等)。 我不需要或不想创建该类型的实例来获取图标。

如果你想绝对要求孩子实现这个,那么我看到这样做的唯一方法是使基类抽象,并公开实例属性以返回图标和友好名称。

这些是抽象的,而不是虚拟的,因此您可以通过派生类强制实现。 我知道它不干净,因为它是更好地存储在类型级别的信息,但它是我可以看到在编译时强制执行此要求的唯一方法。

我认为您可能错过的一点是,您无法覆盖静态属性,这是因为当您编写代码来调用它时,您没有实例,因此编译器将静态链接它那时 – 如果你需要多态性,你需要使用运行时的实例来确定要调用哪个版本的方法。

编辑:(回应你的EDIT2)

你想从什么场景中调用它?

如果您想要针对某个实例显示您的图标,那么您有一个实例,那么为什么不将它作为实例上的属性(因为,毕竟,有人可能会覆盖您的Car以创建SportsCar并希望有所不同它的图标) – 实际上你要求你的对象的属性,虽然它与概念模型匹配(所以它不是轮子的数量,最大速度等;但是可以向最终用户显示它的东西)

EDIT2 🙁回应你的EDIT3)

我要做的方法是使用属性来确定哪个嵌入式资源用作相应类型的图标(因此您不需要实例),并使用reflection来读取值。 您可以定义自己的自定义属性,或查看可能有用的ToolboxItemAttribute 。

也许您可以做的是定义一个属性,用于在插件系统中注册该对象。

这样,您将强制类的开发人员分配属性,以便在您的插件系统中工作。

也许您可以使用像ToolboxBitmapAttribute这样的方法 ,您可以在其中设置找到您的dll资源的图像。