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

时间:2017-03-29 10:55:28

标签: c# wpf internationalization

我的第一个模块中有一堆Shape - 类(经典),如RectangleCircle

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

我希望我的整个代码尽可能模块化,例如如果我添加一个新的Shape - 类,我想尽可能少地改变类。

我的第一个方法是在我的GUI模块中创建一个帮助器类,每个形状包含Shape的{​​{1}},其名称为Type,其图标作为string(或类似)。然后我会在一个地方初始化列表,例如

Bitmap

并将此列表绑定到var shapeList = new List<ShapeHelperClass> { new ShapeHelperClass(typeof(Rectangle), Resources.StringRectangle, Resources.IconRectangle), new ShapeHelperClass(typeof(Circle), Resources.StringCircle, Resources.IconCircle), }; 。现在,如果我重命名我的类或我的资源,没有什么会破坏,本地化应该正常工作。但是,当然,如果在第一个模块中添加新的ListBox - 类,我还需要更新此列表。

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

所以,我的问题是:

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

1 个答案:

答案 0 :(得分:1)

  

1.我的第一个方法是好的,我们可以改进吗?

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

var imageObj = new Image();
var card = new Konva.Image({
    x: 200,
    y: 50,
    width: 100,
    height: 100,
    image: imageObj
});


imageObj.onload = function() {
  card.getLayer().draw();
};
imageObj.src = '/path/to/image.jpg';

// later
imageObj2.src = '/path/to/image.jpg'; // it should trigger onload

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

  

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

也许你可以编写一个单元测试,它使用反射来查找所有形状类型,并断言它们包含在从第一个模块返回的形状列表中。同样对于资源。我无法想到任何更好的自动确保方法。