将资源映射到C#/WPF中的类

将资源映射到C#/WPF中的类,c#,wpf,internationalization,C#,Wpf,Internationalization,在我的第一个模块中,我有一堆形状-类(经典),比如矩形和圆形 在我的第二个模块中,我有一个用WPF制作的GUI。我想显示所有形状-类的列表框。列表框应包含形状的可本地化名称(保存为资源字符串)和图标(保存为资源图像) 我希望我的整个代码尽可能模块化,例如,如果我添加一个新的形状-类,我希望更改尽可能少的类 我的第一种方法是在我的GUI模块中创建一个helper类,它为每个形状保存形状的类型,名称为字符串,图标为位图(或类似)。然后在一个地方初始化列表,例如 var shapeList = new

在我的第一个模块中,我有一堆
形状
-类(经典),比如
矩形
圆形

在我的第二个模块中,我有一个用WPF制作的GUI。我想显示所有
形状
-类的
列表框
列表框
应包含形状的可本地化名称(保存为资源字符串)和图标(保存为资源图像)

我希望我的整个代码尽可能模块化,例如,如果我添加一个新的
形状
-类,我希望更改尽可能少的类

我的第一种方法是在我的GUI模块中创建一个helper类,它为每个形状保存
形状
类型
,名称为
字符串
,图标为
位图
(或类似)。然后在一个地方初始化列表,例如

var shapeList = new List<ShapeHelperClass>
{
  new ShapeHelperClass(typeof(Rectangle), Resources.StringRectangle, Resources.IconRectangle),
  new ShapeHelperClass(typeof(Circle), Resources.StringCircle, Resources.IconCircle),
};
var shapeList=新列表
{
新的ShapeHelperClass(typeof(矩形)、Resources.StringRectangle、Resources.IconRectangle),
新的ShapeHelperClass(typeof(Circle)、Resources.StringCircle、Resources.IconCircle),
};
并将此列表绑定到
列表框
。现在,如果我重命名我的类或资源,就不会有任何问题,本地化应该可以正常工作。但是,当然,如果在第一个模块中添加一个新的
Shape
-类,我还需要更新这个列表

另一种方法是使用反射来查找我所有的
Shape
类,并从中构建列表。但是,我仍然需要一些字典或类似的东西来将类映射到资源。如果资源遵循“Icon”+“Classname”这样的模式,我就可以找到它们。但是,如果没有找到图标,则只有在运行时才会注意到

因此,我的问题是:

  • 我的第一个方法好吗?我们的方法可以改进吗
  • 如何确保添加新
    形状的程序员也添加新资源并扩展映射列表?也许通过单元测试
  • 1.我的第一种方法好吗?我们的方法是否可以改进


    您可以在第一个模块中创建一个返回所有形状的方法,并在客户端应用程序中调用该方法,例如:

    var shapes = GetShapes();
    List<ShapeHelperClass> helpers = new List<ShapeHelperClass>();
    foreach(var shape in shapes)
        helpers.Add(...);
    
    var shapes=GetShapes();
    列表帮助程序=新列表();
    foreach(形状中的变量形状)
    添加(…);
    

    然后,在第一个模块中添加或删除形状时,您不必修改客户端应用程序

    2.如何确保添加新形状的程序员也会添加新资源并扩展映射列表?也许通过单元测试


    也许您可以编写一个单元测试,使用反射查找所有形状类型,并断言它们包含在从第一个模块返回的形状列表中。资源也是如此。我想不出任何更好的自动方式来确保这一点。

    列表/字典解析资源很好,如果您想要自动解析,反射更好(添加了新形状)。添加到
    Shape
    抽象成员以解析资源和文本可能是有意义的。@Sinatr:我不想将抽象成员
    Icon
    Name
    添加到
    Shape
    ,因为这只是GUI的一部分,而不是类本身所必需的。是的,反射将自动找到新类。问题是反射器无法为这些新类创建名称和图标;-)我误解了你的问题,你使用的是
    System.Windows.Shapes
    而不是自定义
    Shape
    类。显然,你不能给它添加任何内容。具有
    字典的解析器类
    听起来适合解析关于特定形状类型的
    Info
    。您可以提供一个静态方法来注册新的形状类型(它是常见的模式,例如wpf中的附加属性)。另一个选项是将此数据包含为类型元数据-使用属性,对于标准类,您必须定义列表/字典,对于新创建的-通过属性解析。@Sinatr否,它不是Windows-
    形状
    -类,而是自定义类。。。无论如何,这只是一个例子,它可以是其他任何东西……”那么,在第一个模块中添加或删除形状时,您不必修改客户端应用程序。”->好吧,我仍然需要添加资源,这当然是不可避免的。。。“您可以在第一个模块中创建一个返回所有形状的方法,并在客户端应用程序中调用此方法[…]”->您如何想象
    GetShapes()呢
    -方法?我的意思是,要么它是第一个模块中的硬编码列表,然后我也可能忘记向其中添加新的
    形状。或者它使用反射,但是我可以使用GUI模块中的反射,并且不需要这个功能……在GUI模块中使用反射听起来是个坏主意。查找所有形状的逻辑不应该在UI中实现。它应该封装在另一个模块中。当然,您仍然必须将形状和资源添加到应用程序的某个位置。