将资源映射到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”这样的模式,我就可以找到它们。但是,如果没有找到图标,则只有在运行时才会注意到
因此,我的问题是:
形状的程序员也添加新资源并扩展映射列表?也许通过单元测试
您可以在第一个模块中创建一个返回所有形状的方法,并在客户端应用程序中调用该方法,例如:
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中实现。它应该封装在另一个模块中。当然,您仍然必须将形状和资源添加到应用程序的某个位置。