2015-11-30 2 views
0

Givens:Impossible d'accéder à la propriété imbriquée de tableau de classe statique

  1. La classe doit être accessible à l'intérieur une autre classe qui doit être statique (pas le choix).
  2. La classe FOO doit être récursif prenant en charge un tableau imbriqué d'une collection d'éléments étant donné la structure de l'exemple.
  3. FOO doit être sérialisable dans son intégralité, y compris tous les tableaux imbriqués et les éléments suivants inclus dans XML (sans utiliser les astuces - juste sérialiser directement en xml qui semble ne prendre en charge qu'une seule classe et rechercher automatiquement les classes/structures imbriquées)

le problème est que je ne peux pas faire comme suit les propriétés de FOOTabItem ne sont pas accessibles.

// can not be static 
public class TestClass : SomeFancyInheritedObject { 

    // must be static 
    public static void Test() { 
     FOO.FOOTabItem bar = new FOOTabItem(); 

     bar.Count = 100; // This is inaccessible 
    } 

} 

C'est le code de classe que je ne parviens pas à faire les objets exposés de:

public static class FOO { 
    public static int Money { get; set; } 

    public static List<FOOTab> Tabs { get; set; } 


    public static struct FOOTab { 
     public static List<FOOTabItem> Items { get; set; } 

     public static FOOTab TabInformation { get; set; } 
    } 

    public static struct FOOTabItem { 
     public static ItemInfo Item { get; set; } 
     public static int Count { get; set; } 

    } 

    public static FOO() { 
     Tabs = new List<FOOTab>(); 
     Money = 0; 
    } 

} 

J'ai aussi essayé d'utiliser des classes imbriquées au lieu de struct dans FOO, mais cela a donné lieu à FOO se plaindre que je ne peut pas utiliser une classe en tant que paramètre d'objet, c'est pourquoi j'utilise struct à la place.

Il n'y a aucune erreur de syntaxe avec ce code. Je peux exposer les propriétés/etc de FOO lui-même et instancier new() des structures, mais je ne peux pas voir les propriétés des structures.

Je crois que c'est probablement un problème d'autorisations (public/statique/interne/etc), mais je ne sais pas exactement quoi faire pour corriger cela. J'ai recherché SO et il y a des problèmes semblables dans la nature cependant ils n'offrent aucune perspicacité claire au sujet des listes imbriquées d'objets dans les classes statiques et comment les accéder correctement à partir d'autres classes statiques.

+3

Vous avez beaucoup de problèmes dans votre code. Pourquoi TestClass.Test() doit-il être statique? Pourquoi les structures statiques FOOTab et FooTabItem? Dans TestClass.Test() vous essayez de créer une nouvelle instance de FOO.FOOTabItem(), vous ne pouvez pas instancier une classe statique. – KiwiPiet

+0

Donnera la courte explication. TestClass.Test() est un remplacement statique et doit être dû à la façon dont le développeur a écrit la méthode réelle dont il hérite. J'ai obscurci et utilisé 'Test' et 'Foo' et 'Bar' pour une représentation plus classique du problème. En outre, j'ai trouvé pourquoi les propriétés des structures n'étaient pas exposées parce que même si la structure doit être 'statique' pour être visible dans les méthodes statiques, les propriétés ne devraient pas avoir de 'statique' car cela empêche l'exposition. –

+0

En outre, si downvoting est une fonctionnalité fantastique, si vous votez en baisse simplement parce que vous ne pouvez pas comprendre ou n'aimez pas ce que vous voyez qui montre vraiment la maturité et est contre-productif de ce que la fonctionnalité est réellement là pour. Ce n'est pas une option semblable/non aimante. C'est un vote sur la qualité de la recherche et la clarté de la question. –

Répondre

1

J'ai supprimé tous les mots-clés statiques dans le code ci-dessous. Ici, bar.Count est accessible.

public class TestClass : SomeFancyInheritedObject 
{ 
    public static void Test() { 
     FOO.FOOTabItem bar = new FOO.FOOTabItem(); 
     bar.Count = 100; // This is now accessible 
    } 
} 
public class FOO { 
    public int Money { get; set; } 
    public List<FOOTab> Tabs { get; set; } 

    public FOO() { 
     Tabs = new List<FOOTab>(); 
     Money = 0; 
    } 

    public struct FOOTab { 
     public List<FOOTabItem> Items { get; set; } 
     public FOOTab() 
     { 
      Items = new List<FOOTabItem>(); 
     } 
    } 

    public struct FOOTabItem { 
     public ItemInfo Item { get; set; } 
     public int Count { get; set; } 
    } 
} 

MISE À JOUR: En réponse à votre commentaire, voici le code que je l'ai testé dans VS:

class Program 
{ 
    public static void Main(string[] args) 
    { 
     var foo = new FOO(); 
     var x = new XmlSerializer(typeof(FOO)); 
     using (var memoryStream = new MemoryStream()) 
     { 
      using (var writer = new StreamWriter(memoryStream)) 
      { 
       x.Serialize(writer, foo); 
      } 
     } 
    } 
} 

public class FOO 
{ 
    public int Money { get; set; } 
    public List<FOOTab> Tabs { get; set; } 

    public FOO() 
    { 
     Tabs = new List<FOOTab>(); 
     Money = 0; 
    } 

    public class FOOTab 
    { 
     public List<FOOTabItem> Items { get; set; } 
     public FOOTab() 
     { 
      Items = new List<FOOTabItem>(); 
     } 
    } 

    public class FOOTabItem 
    { 
     public ItemInfo Item { get; set; } 
     public int Count { get; set; } 
    } 
} 

public class ItemInfo 
{ 
} 
+0

C'est ce que j'ai trouvé travaillé aussi. Juste fini de faire cela avant de répondre ci-dessus. Je ne sais toujours pas pourquoi je ne peux pas le sérialiser car il gémit sur les sous-types >> System.InvalidOperationException: Il y avait une erreur reflétant le type. –

+0

J'ai changé les structures en classes, car les structures devraient vraiment être immuables. Et ajouté du code qui montre qu'il est sérialisé. – KiwiPiet

+0

Je ne sais pas pourquoi, mais même après les ajustements, j'obtiens une erreur de réflexion sur cette ligne >> 'System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer (typeof (MyNameSpace.FOO));' indiquant l'erreur ci-dessus. Surfant SO pour cela, mais ne trouvant rien. Est-il possible que le logiciel parent bloque la réflexion? –