【问题标题】:Getting nth property of static class" C#?获取静态类的第 n 个属性“C#?
【发布时间】:2021-03-07 21:25:44
【问题描述】:

有一个名为“获取类的第 n 个属性”here 的问题的答案不适用于静态类。

这是我的静态类:

namespace MyNameSpace
{
    static class MyStaticClass
    {
        public static byte[] BASIC_IFO = { 0xCC, 0x55, 0xD1, 0x00, 0x00, 0x00 };
        public static byte[] DEFINITION = { 0xCC, 0x55, 0xD2, 0x00, 0x00, 0x00 };
        public static byte[] GET_PARAMETERS = { 0xFF, 0x55, 0xD3, 0x00, 0x00, 0x00 };
    }
}

如何从主类访问此静态类的第 n 个属性值(在本例中为字节数组)?上面的问题没有解决我的问题。

【问题讨论】:

  • 你能显示你试过的代码吗?
  • 第n个属性是什么意思?
  • 我的意思是从上到下的第 n 行。在我的例子中,第一个是 BASIC_IFO,最后一个是 GET_PARAMETERS。
  • 依赖索引resp ..事情的顺序似乎很脆弱。我会去取名字。
  • 链接问题中的答案不起作用不是因为静态类(除了绑定标志),而是因为您暴露了字段而不是属性。转换为属性或使用 GetFields...但是,我仍然不推荐

标签: c# reflection


【解决方案1】:

最简单的方法是将数组封装在 KeyValuePair 的集合中。公开一个名为 Arrays 的 List<KeyValuePair<string, byte[]>>,并将您的数组添加到其中:

namespace MyNameSpace
{
    static class MyStaticClass
    {
        public static readonly List<KeyValuePair<string, byte[]>> Arrays = new List<KeyValuePair<string, byte[]>>();

        static MyStaticClass()
        {
            Arrays.Add(new KeyValuePair("BASIC_IFO", new byte[] { 0xCC, 0x55, ... }));
        }
    }
}

并像这样引用它:

var BASIC_IFO = MyStaticClass.Arrays[0].Value;

...像这样搜索它:

var BASIC_IFO = MyStaticClass.Arrays.FirstOrDefault(kvp => kvp.Key == "BASIC_IFO").Value;

...或将其转换为字典:

var dictArrays = MyStaticClass.Arrays.ToDictionary(p => p.Key, p => p.Value);
var val = dictArrays["BASIC_IFO"][1]; // == 0x55
var val = Arrays[0].Value[1]; // == 0x55

【讨论】:

  • Arrays.Add(new KeyValuePair("BASIC_IFO", new byte[] { 0xCC, 0x55}));
  • 它表示名称 Arrays 在当前上下文中不存在。是tit紧跟在宝贵的线之后,而且它们都在静态类中吗?
  • 上面的代码是餐巾纸...请不要随便复制粘贴,慢慢看懂。对 Add 的调用需要在方法中。
  • 你能举个例子吗? Add 是我在那里感到困惑的一种方法。
  • 它显示错误使用泛型类型 'Dictionary' 需要 2 个类型参数 :(
【解决方案2】:

我认为最简单的方法是使用属性而不是字段,这样您就可以使用 GetProperties 方法将所有属性作为 PropertyInfo 对象的数组。

所以,使用属性,这就是您的问题可以轻松解决的方法

static class MyStaticClass
{
    public static byte[] BASIC_IFO { get; set; } = { 0xCC, 0x55, 0xD1, 0x00, 0x00, 0x00 };
    public static byte[] DEFINITION { get; set; } = { 0xCC, 0x55, 0xD2, 0x00, 0x00, 0x00 };
    public static byte[] GET_PARAMETERS { get; set; } = { 0xFF, 0x55, 0xD3, 0x00, 0x00, 0x00 };
}

现在您可以像这样访问第 n 个属性

int n = 2; // your n
PropertyInfo prop = typeof(MyStaticClass).GetProperties()[n];

byte[] nthPropertyValue = prop.GetValue(null) as byte[];

【讨论】:

  • IMO 反射不应用作访问数据的默认方式...如果您需要一个集合,请公开一个集合。
  • @DrunkenCodeMonkey 这就是我要找的东西
猜你喜欢
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多