2011-09-07 9 views
11

que tengo una clase estática en un montaje refrenced (llamado "DAL") llamado "A7":Como llegar campos y sus valores de una clase estática en un ensamblaje con referencia

A7 así:

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"; 
} 

¿Cómo puedo obtener el nombre y los valores de todas las propiedades desde DAL ensamblar clase A7?

gracias

+0

no consideran que Mi clase está en otra asamblea – Arian

Respuesta

23

Al utilizar la reflexión, deberá buscar los campos; estas no son propiedades. Como se puede ver en el siguiente código, busca miembros estáticos públicos:

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(); 
     } 
    } 
+0

No considero que Mi clase está en otro ensamblado – Arian

+0

@Nima La pregunta indica claramente "en un ensamblaje refrendado", por lo que funcionará suponiendo que tiene las declaraciones 'using' relevantes. –

+0

¡Esto es por el nombre pero no por el valor! – PVitt

0

Sólo añadir una referencia al archivo DAL.dll (o lo que hemos llamado) e incluirlo en la sección de usar. Entonces deberías poder acceder a los campos públicos.

+0

Sí tienes razón Dal.dll –

+0

Pero no sería capaz de obtener todos los nombres de los campos declarados públicamente en tiempo de ejecución. Es por eso que quieres usar la reflexión. – stombeur

+0

Estoy totalmente de acuerdo –

3

Ver this o this cuestión.

Como verás en la primera pregunta, también mezclas propiedades y campos. Lo que se está declarando son campos, no propiedades

Así que una variante de esto debería funcionar:

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 
} 
+0

GetValue necesita una instancia, pero A7 es estático. – PVitt

+0

@PVitt En clases estáticas, pase 'null'. –

+0

Ah, no vi el tipo FieldInfo, pensé que sería un PropertyInfo. Mi culpa. – PVitt

2

algo como esto:?

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

que enfrentan el mismo problema cuando traté de obtener las propiedades mediante la siguiente sintaxis (donde "ConfigValues" es una clase estática con propiedades estáticas y estoy buscando una propiedad con el nombre de "Lookingfor")

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

la solución fue utilizar el operador typeof lugar

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

que funciona, que no tiene que ver como campos

HTH

Cuestiones relacionadas