gpt4 book ai didi

c# - 如何使用反射获取 C# 静态类属性的名称?

转载 作者:行者123 更新时间:2023-11-30 14:41:55 30 4
gpt4 key购买 nike

我想制作一个 C# 字典,其中键是类中静态属性的字符串名称,值是属性的值。给定类中名为 MyResources.TOKEN_ONE 的静态属性,我如何才能在属性的名称处获取而不是它的值?我只关心属性名称的结尾部分(例如“TOKEN_ONE”)。

我对它进行了编辑以提及我不想映射字典中的所有 属性值,只是类中所有内容的一小部分。因此,假设我想获取单个属性的名称。鉴于 MyResources.TOKEN_ONE,我想取回“MyResources.TOKEN_ONE”或只是“TOKEN_ONE”。

下面是一些示例代码,展示了我正在尝试做的事情。我需要属性名称,因为我正在尝试生成一个 javascript 变量,我在其中将属性名称映射到变量名称,并将属性值映射到变量值。例如,我希望 C# 字典生成如下所示的行:

var TOKEN_ONE = "一";

using System;
using System.Collections.Generic;

namespace MyConsoleApp
{
class Program
{
static void Main(string[] args)
{
Dictionary<String, String> kvp = new Dictionary<String, String>();

// How can I use the name of static property in a class as the key for the dictionary?
// For example, I'd like to do something like the following where 'PropertyNameFromReflection'
// is a mechanism that would return "MyResources.TOKEN_ONE"
kvp.Add(MyResources.TOKEN_ONE.PropertyNameFromReflection, MyResources.TOKEN_ONE);
kvp.Add(MyResources.TOKEN_TWO.PropertyNameFromReflection, MyResources.TOKEN_TWO);

Console.ReadLine();
}
}

public static class MyResources
{
public static string TOKEN_ONE
{
get { return "One"; }
}

public static string TOKEN_TWO
{
get { return "Two"; }
}
}
}

最佳答案

如果您只是希望能够在代码中的一个位置引用单个特定属性, 不必通过文字字符串来引用它,那么您可以使用表达式树。例如,下面的代码声明了一个将这样的表达式树转换为 PropertyInfo 对象的方法:

public static PropertyInfo GetProperty(Expression<Func<string>> expr)
{
var member = expr.Body as MemberExpression;
if (member == null)
throw new InvalidOperationException("Expression is not a member access expression.");
var property = member.Member as PropertyInfo;
if (property == null)
throw new InvalidOperationException("Member in expression is not a property.");
return property;
}

现在你可以这样做:

public void AddJavaScriptToken(Expression<Func<string>> propertyExpression)
{
var p = GetProperty(propertyExpression);
_javaScriptTokens.Add(p.Name, (string) p.GetValue(null, null));
}

public void RegisterJavaScriptTokens()
{
AddJavaScriptToken(() => Tokens.TOKEN_ONE);
AddJavaScriptToken(() => Tokens.TOKEN_TWO);
}

关于c# - 如何使用反射获取 C# 静态类属性的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3536228/

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