none
Probleme sur type anonyme RRS feed

  • Question

  • Bonjour,

    J'ai un problème pour que le .net me retourne des types anonymes, voici le code qui fonctionne dans la console (N°1) et pour des problèmes d'architecture, je souhaite faire le code suivant (N°2).
    je pense qu'il y a un problème de droit de reflexion !
    avez un avis sur la question ?

    Code N°1
        class Program
        {
            static void Main(string[] args)
            {
                            var result = CastAnonymousObject(GetProcesses(), new { ProcessID = 0, Name = "" });

                Console.WriteLine("{0}\t {1}", result.ProcessID, result.Name);
                Console.Read();
            }
           
            static System.Object GetProcesses()
            {
                return (from proc in System.Diagnostics.Process.GetProcesses()
                        orderby proc.ProcessName ascending
                        select new { ProcessID = proc.Id, Name = proc.ProcessName }).First();
            }

            static A CastAnonymousObject<A>(object anomymousObject, A anonymousType)
            {
                return (A)anomymousObject;
            }
        }


    Code N°2

    Code dans la console

    class Program : ClassTest

        {
           
            static void Main(string[] args)
            {
                    var result1 = CastAnonymousObject(ClassTest.GetProcesses(), new { ProcessID = 0, Name = "" });

                    Console.WriteLine("{0}\t {1}", result1.ProcessID, result1.Name);
                    Console.Read();
                }

        }


    code dans un projet de type biblio de classe et faire un reference a ce projet dans la console

    public class ClassTest
    {

        public ClassTest()
        {

        }

        public static System.Object GetProcesses()
        {
            return (from proc in System.Diagnostics.Process.GetProcesses()
                    orderby proc.ProcessName ascending
                    select new { ProcessID = proc.Id, Name = proc.ProcessName }).First();
        }

        public static A CastAnonymousObject<A>(object anomymousObject, A anonymousType)
        {
            return (A)anomymousObject;
        }
    }

    Voici la description de l'erreur :

    L'exception System.InvalidCastException n'a pas été gérée
      Message="Impossible d'effectuer un cast d'un objet de type '<>f__AnonymousType0`2[System.Int32,System.String]' en type '<>f__AnonymousType0`2[System.Int32,System.String]'."
      Source="ClassDataC"
      StackTrace:
           à ClassTest.CastAnonymousObject[A](Object anomymousObject, A anonymousType) dans C:\Documents and Settings\Pc perso\Mes documents\Visual Studio 2008\Projects\Pubert.Doc.Data\ClassDataC\ClassTest.cs:ligne 25
           à Program.Main(String[] args) dans C:\Documents and Settings\Pc perso\Mes documents\Visual Studio 2008\Projects\Pubert.Doc.Data\ConsoleApplication1\Program.cs:ligne 15
           à System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
           à System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           à Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           à System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           à System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           à System.Threading.ThreadHelper.ThreadStart()
      InnerException:


    Merci pour vos remarques.

    mercredi 2 septembre 2009 22:49

Réponses

  • Bonjour,

    Je n'ai pas testé votre code et cherché d'où vient le problème, mais je tiens à apporter une petite précision :

    Je vous déconseille (très fortement) d'utiliser les types anonymes dans des valeurs de retours de vos méthodes. Les types anonymes doivent être utilisés uniquement dans les code d'une méthode (sauf cas exceptionnel). En utilisant les types anonymes en dehors de la méthode qui la crée vos perdait en typage et en lisibilité de votre code.

    Dans votre cas, pour faire propre et pro, crée une classe : MyProcessInformation avec 2 propriétés (id + nom) (en lecture) et un constructeur prennant en paramètre l'id et le nom du process.

    Ensuite au niveau du select de votre requête Linq, faites :

    ...
    select new MyProcessInformation(proc.Id, proc.ProcessName)
    ...

    Votre méthode doit maintenant retourner un objet de type MyProcessInformation

    Ainsi, plus besoin de cast, cela simplifie la lecture de votre code et en plus çà type énormément votre code !

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    samedi 5 septembre 2009 19:42
    Modérateur