gpt4 book ai didi

c# - 如何在不更改调用方的情况下捕获 C# 静态字符串资源属性的名称?

转载 作者:太空狗 更新时间:2023-10-29 20:00:32 26 4
gpt4 key购买 nike

在Strings.resx/Strings.Designer.cs中有字符串资源,这样使用:

myObject.DoSomething(Strings.HelloWorld);

我能否在不更改调用 DoSomething 的源代码行的情况下在 DoSomething 中捕获资源 ID(即“Strings.HelloWorld”)?我想要 Strings.Designer.cs 中定义的静态属性的名称,以及字符串值。

我的结论是:

myObject.DoSomething(() => Strings.HelloWorld);

然后:

void DoSomething(Expression<Func<string>> expr)
{
string id = expr.Body.ToString();
string value = (expr.Compile())();
// do something with these...
}

这稍微改变了原始行,但它仍然可读,编译器正在为我检查属性名称。

我想知道是否有任何 C# 魔术可以在不更改原始行的情况下执行此操作。

编辑:真的,我只想为我用来格式化 TraceEvent 消息的每个字符串资源设置唯一的整数,以用作 TraceEvent id。当编译器可以为我维护整数列表时,我不想自己维护一个整数列表,每次我插入一个新的源代码行时都添加一个以跟踪其他有趣的东西。我在初始化时通过将 ResourceSet 键映射到一系列整数来获得我的整数,而且我不介意数字是否在构建之间转移。

EDIT2:引用 LBushkin 的回答,我最初确实将字符串映射到 int,如下所示:

var resourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true);

var sorted =
from i in resourceSet.Cast<DictionaryEntry>()
orderby i.Key
select i.Value as string;

var valueToId = new Dictionary<string, int>();

foreach (string value in sorted)
{
valueToId[value] = valueToId.Count + 100; // whatever range you like
}

...但我不喜欢依赖静态的 CurrentCulture。我想要一个简单的低技术、低维护的资源字符串映射到唯一的整数,我需要做的就是在我喜欢的时候在设计器中添加字符串。

最佳答案

不,恐怕没有任何东西可以做到这一点。 lambda 表达式是最接近的。

编辑:警告 - 前面有臭味代码

至少,如果您不想在与调用方相同的命名空间中的另一个 Strings 类中添加额外的方法,情况就是如此。这是一个非常糟糕的技巧:

// You'd want to autogenerate this class based on the designer file.
public class Strings
{
public static string HelloWorld()
{
return global::OriginalNS.Strings.HelloWorld;
}
}

然后...

void DoSomething(Func<string> provider)
{
string id = provider.Method.Name;
string value = provider();
}

现在这个:

myObject.DoSomething(Strings.HelloWorld);

使用方法编译成方法组转换Strings.HelloWorld . DoSomething找到该方法的名称以获取 ID,并调用委托(delegate)以获取实际值。

只有在 Strings 时才有效与调用 DoSomething 的方法位于不同的命名空间中, 这样你就可以劫持名称 Strings 的使用.我想另一种选择是使用指令:

using Strings = EvilStrings;

但总的来说:呃!不要这样做!当然,考虑起来很有趣,但我不希望它出现在生产代码中......

关于c# - 如何在不更改调用方的情况下捕获 C# 静态字符串资源属性的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251955/

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