如何从引用程序集中的静态类获取字段及其值

时间:2011-09-07 12:43:12

标签: c# reflection c#-4.0

我在一个名为“A7”的refrenced程序集(名为“DAL”)中有一个静态类:

A7喜欢这样:

public static class A7
{
public static readonly bool NeedCoding = false;
public static readonly string Title = "Desc_Title"
public static readonly string F0 = "";
public static readonly string F1 = "Desc_F1";
public static readonly string F2 = "Desc_F2";
public static readonly string F3 = "Desc_F3";
public static readonly string F4 = "Desc_F4";
}

如何从 DAL 汇编A7类获取所有属性名称和值?

感谢

6 个答案:

答案 0 :(得分:34)

使用反射,你需要寻找字段;这些不是属性。从下面的代码中可以看出,它查找公共静态成员:

    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(A7);
            FieldInfo[] fields = t.GetFields(BindingFlags.Static | BindingFlags.Public);

            foreach (FieldInfo fi in fields)
            {
                Console.WriteLine(fi.Name);
                Console.WriteLine(fi.GetValue(null).ToString());
            }

            Console.Read();
        }
    }

答案 1 :(得分:4)

当我尝试使用此语法获取属性时,我遇到了同样的问题(其中“ConfigValues”是一个具有静态属性的静态类,我正在寻找名为“LookingFor”的属性)

PropertyInfo propertyInfo = ConfigValues.GetType().GetProperties().SingleOrDefault(p => p.Name == "LookingFor");

解决方案是使用typeof运算符

PropertyInfo propertyInfo = typeof(ConfigValues).GetProperties().SingleOrDefault(p => p.Name == "LookingFor");

有效,你不必将它们视为字段

HTH

答案 2 :(得分:3)

请参阅thisthis问题。

正如您在第一个问题中所注意到的那样,您还会混淆属性和字段。你宣称的是字段,而不是属性

所以这个的变体应该有效:

Type myType = typeof(MyStaticClass);
FieldInfo[] fields= myType.GetFields(
       BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
foreach (FieldInfo f in fields)
{
    // use f.Name and f.GetValue(null) here
}

答案 3 :(得分:2)

这样的事情:?

FieldInfo[] fieldInfos = typeof(A7).GetFields(BindingFlags.Static | BindingFlags.Public);

答案 4 :(得分:0)

只需添加对DAL.dll(或其他任何名称)文件的引用,并将其包含在using部分中。然后你应该能够访问公共字段。

答案 5 :(得分:0)

 public static IEnumerable<T> GetAll<T>() where T : class
    {
      var fields = typeof(T).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly);
       return fields.Select(f => f.GetValue(null)).Cast<T>();
    }