gpt4 book ai didi

c# - 用 DynamicObject 替换静态资源属性

转载 作者:行者123 更新时间:2023-11-30 17:58:09 28 4
gpt4 key购买 nike

在我们的应用程序中,Resources.designer.cs 文件中有 1000 次静态属性的使用。例如:

Resources.string_to_identify_the_resource

我们也有自己的类,它查找资源,但也允许资源被其他程序集覆盖。如果我们的客户想要重命名插件或产品,这将很有用,因为我们只需放入一个 dll 即可完成。这个类的用法如下:

Resources.GetString("string_to_identify_the.resource");

我们希望通过我们自己的 Resources 类查找我们所有的资源,以便可以覆盖它们,而我的任务就是这样做。我不喜欢检查和重构所有代码。

我最初的想法是使用自定义 DynamicObject:

public class Resources
{
public static dynamic Dynamic = new StaticResourcesDynamicObject();

class StaticResourcesDynamicObject : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = GetString(binder.Name);
return true;
}
}

// Existing code to lookup resources
public static string GetString(string name)
{
...
}
}

所以

Resources.string_to_identify_the_resource

将简单地重命名为:

Resources.Dynamic.string_to_identify_the_resource

主要问题是很多资源名称包含句点 (.),因此它们与静态属性不匹配。例如 Cmd.Too_Much 有一个静态属性 Cmd_Too_Much

我可以尝试获取所有不同的可能性,或者其他人有解决问题的方法吗?

最佳答案

为此,您必须创建自定义代码生成器,因为 Visual Studio 会为您生成资源。生成的类是静态的、不可扩展的,并且非常紧密地耦合到与 Resx 一起工作的 .NET ResourceManager。

您可以通过创建自定义强类型资源生成器并在 Visual Studio 中替换它来更改此设置。 Visual Studio 使用 ResXFileCodeGeneratorPublicResXFileCodeGenerator,或者您可以创建一个独立的工具来运行项目中的所有 Resx 文件并生成自定义的强类型资源类。

如果您想了解如何执行此操作,可以查看 Westwind.Globalization其中包括 StronglyTypedResources为数据库资源(或 Resx)创建强类型类的类。您可以获取该代码并对其进行修改以生成执行您需要的自定义类。

也就是说,我认为动态不是您想要的。而是可以以实现您要执行的逻辑的方式创建 Getters。例如,我想确保如果未找到资源,则始终返回 something - 绝不会返回 null 或空白值。因此,如果缺少资源,我会返回总比没有好的资源 ID。

关于c# - 用 DynamicObject 替换静态资源属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587684/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com