2017-10-03 6 views
0

J'essaie d'obtenir le nom de la propriété de classe et son type de données dynamiquement pour n'importe quelle classe afin que je puisse créer le modèle de schéma requis pour Db, par exemple. Google BigQuery. J'ai été capable d'obtenir le nom de la chaîne ou le nom de la propriété int, mais avec le tableau ou la liste de la classe personnalisée, je ne sais pas comment obtenir leur propriété et leur nom de classe.Nom de la propriété de classe et son type de données pour la sous-classe utilisant Reflection

Mon modèle est:

public class StateModel 
{ 
    public string State { get; set; } 
    public string Gender { get; set; } 
    public int Year { get; set; } 
    public string Name { get; set; } 
    public int Number { get; set; } 

    public int[] Items { get; set; } 
    public List<string> Values { get; set; } 

    public Coordinate[] OrdinateArray { get; set; } 
    public List<Coordinate> Ordinates { get; set; } 

    public Coordinate CoordinateObj { get; set; } 
} 

public class Coordinate 
{ 
    public int Point { get; set; } 
    public string Value { get; set; } 
} 

Ma méthode pour obtenir la propriété de classe est:

public static Dictionary<string, object> GetColumnFromClass<T>() where T : class, new() 
{ 
    Dictionary<string, object> fields = new Dictionary<string, object>(); 
    T obj = new T(); 
    var type = obj.GetType();  
    PropertyInfo[] properties = type.GetProperties(); 
    foreach (var item in properties) 
    { 
     fields.Add(item.Name, item.PropertyType.Name.ToUpper()) 
    } 
    return fields; 
} 

Quelqu'un peut-il me aider comment obtenir Coordonnez les détails de classe à savoir (Nom du point et la valeur de la classe de coordonnées) à partir des propriétés ci-dessous:

public Coordinate[] OrdinateArray { get; set; } 
public List<Coordinate> Ordinates { get; set; } 
public Coordinate CoordinateObj { get; set; } 

Remarque: J'avais besoin d'obtenir les détails de la sous-classe dynamiquement et pas codé en dur.

+0

@DiskJunky ma question n'est pas de déterminer seulement si sa collection mais d'obtenir le nom de propriété de collection et son type de données aussi bien. J'ai clairement mentionné dans ma question –

+0

comme ceci: https://stackoverflow.com/questions/5949688/how-to-iterate-the-list-in-reflection? – DiskJunky

+0

@DiskJunky Désolé de ne pas itérer une liste. Cette classe est juste un type générique et j'ai besoin d'obtenir tous ses noms de propriétés et types de données et rien à voir avec la valeur de la propriété. J'apprecitae votre effort essayant d'aider mais ma question est simple comment obtenir le nom de propriété de sous-classe personnalisée et son type de données si cette classe est décarée comme classe simple, Liste <> ou []. –

Répondre

1

S'il vous plaît voir si cela répondra à vos besoins (nom de la propriété même dans le parent et l'enfant conduira à une seule entrée de parent, ce qui peut être manipulé avec un paramètre de profondeur de récursivité):

private static ConcurrentDictionary<string, object> GetColumnFromClass(object obj, ConcurrentDictionary<string, object> fields) 
     { 
      //null type will not be processed 
      if (obj == null) 
       return null; 

      Type objType = obj.GetType(); 
      PropertyInfo[] properties = objType.GetProperties(); 

      foreach (PropertyInfo property in properties) 
      { 
       if (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(List<>)) 
       { 
        Type itemType = property.PropertyType.GetGenericArguments()[0]; 
        if (itemType == typeof(string)) 
         fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o); 
        else 
        { 
         fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o); 
         GetColumnFromClass(Activator.CreateInstance(itemType), fields); 
        } 
       } 
       else 
       { 
        object propVal = property.GetValue(obj, null); 
        if (property.PropertyType.Assembly == objType.Assembly) 
        { 
         fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k,o) => o); 
         GetColumnFromClass(propVal, fields); 
        } 
        else 
        { 
         fields.AddOrUpdate(property.Name, property.PropertyType.Name.ToUpper(), (k, o) => o); 
        } 
       } 
      } 
      return fields; 
     }