如何使用反射从静态类中获取静态属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用反射从静态类中获取静态属性相关的知识,希望对你有一定的参考价值。

我有一个带静态getter的静态类。

public static class Cars
{
   public static KeyValuePair<Guid, string> Acura
   {
       get { return new KeyValuePair<Guid, string>(new Guid("MMMMMMMM-509B-477A-ADB1-5CD014B41001"), "Acura"); }
   }
   public static KeyValuePair<Guid, string> AlfaRomeo
   {
      get { return new KeyValuePair<Guid, string>(new Guid("MMMMMMMM-509B-477A-ADB1-5CD014B41002"), "Alfa Romeo"); }
   }
   // etc.
}

我需要从这个静态类中检索所有静态属性,并对每个KeyValuePair执行一些操作。但是下面在运行时抛出一个System.FormatException,说它无法找到可识别的数字

Type type = typeof(Cars);
foreach(var manufacturer in type.GetProperties())
{
    if(manufacturer.PropertyType == typeof(KeyValuePair<Guid, string>))
    {
        var v = manufacturer.GetValue(null, null); //this does not work
        // How to get the KeyValuePair<Guid, string>? 
    }
}

如何获得每个KeyValuePair?

更新:对不起..解决方案工作正常,问题是GUID不是有价值的Guids .. M不是十六进制字符

答案

这不需要对反射或静态属性执行任何操作。在您的属性的getter中,抛出异常。

"MMMMMMMM-509B-477A-ADB1-5CD014B41001""MMMMMMMM-509B-477A-ADB1-5CD014B41002"不是有效的Guids。使用有效值创建Guids,属性不会抛出异常。

Guid中的每个数字必须是十六进制数字(请参阅here)。

new Guid("MMMMMMMM-509B-477A-ADB1-5CD014B41001")

例如,将抛出异常

new Guid("00000000-509B-477A-ADB1-5CD014B41001")

惯于。

以上是关于如何使用反射从静态类中获取静态属性的主要内容,如果未能解决你的问题,请参考以下文章

反射以及内置方法

Java反射之反射权限和静态属性的赋值

反射 内置方法

java中如何通过反射获取类的属性

如何从应用程序域中所有加载的程序集中获取所有静态类并使用反射调用静态方法

python反射详解