9
votes

"Mot-clé" Ceci 'n'est pas valide dans une propriété statique, une méthode statique ou une initialiseur de champ statique "lors de l'ajout de méthodes à un expresoObject

J'essaie d'ajouter une méthode dynamique à expandoObject, qui reviendrait les propriétés (ajoutées de manière dynamique), mais cela me donne toujours une erreur.

est quelque chose de mal que je fais ici? P>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Dynamic;

namespace DynamicDemo
{
class ExpandoFun
{
    public static void Main()
    {
        Console.WriteLine("Fun with Expandos...");
        dynamic student = new ExpandoObject();
        student.FirstName = "John";
        student.LastName = "Doe";
        student.Introduction=new Action(()=>
      Console.WriteLine("Hello my name is {0} {1}",this.FirstName,this.LastName);
    );

        Console.WriteLine(student.FirstName);
        student.Introduction();
    }
}
}


0 commentaires

4 Réponses :


3
votes

Il n'y a pas de "ceci" disponible pour vous.

Capturez l'objet lors de la création de la Lambda à la place:

étudiant.Introduction = nouvelle action ( () => Console.writeline ("Bonjour mon nom est {0} {1}", étudiant.firstName, étudiant.lastname) );

alors ça marche.


0 commentaires

0
votes

Vous appelez le code d'action de la méthode principale statique. Là, vous ne pouvez pas accéder aux propriétés d'objet. Vous devez le remplacer par

student.Introduction = new Action(
    () =>
    {
        Console.WriteLine("Hello my name is {0} {1}", student.FirstName, student.LastName);
    };


0 commentaires

1
votes

Vous ne pouvez pas utiliser ce mot-clé dans l'action, car ici ce fait référence à l'instance actuelle (non étudiante), ce qui provoque l'erreur de compilation car le code est dans une méthode statique. Vérifiez ceci: xxx

sortie: xxx


0 commentaires

9
votes

Eh bien, vous utilisez ceci code> dans la Lambda, qui ferait référence à l'objet qui crée l'action code>. Vous ne pouvez pas faire cela parce que vous êtes dans une méthode statique.

Même si vous étiez dans une méthode d'instance, cela ne fonctionnerait pas avec ce code> car il se réfère à l'instance de l'objet créant la création de la création de l'objet. action code>, pas le expandoObject code> où vous le placez. p>

Vous devez faire référence à expandoObject (étudiant): P>

student.Introduction=new Action(()=>
    Console.WriteLine("Hello my name is {0} {1}",student.FirstName,student.LastName);
);


6 commentaires

Une dernière question? Ensuite, comment puis-je ajouter une méthode d'usine à l'expandobject qui retournerait mon étudiant dynamique?


@Humblecoder: voulez-vous dire que ceci étudiant.get = nouveau func (() => étudiant) ?


Salut Fernandes! Je voulais créer un objet dynamique (un enregistrement actif) qui aurait des propriétés (lire à partir des colonnes de la table de base de données) et des méthodes (dynamique Findbyxxx) où XXX est le nom de la colonne, similaire à NHibernate Finders. Quelle est la meilleure approche?


@Humblecoder: Je suppose que cela justifierait toute une autre question.


Supposons qu'il y a une classe appelée étudiant: étudiant de classe {Public int Id {Obtenir; ensemble; } String Public StringName {Obtenir; ensemble; } String Public String Nom {Obtenir; ensemble; }} Je veux ajouter de manière dynamique les méthodes suivantes: FindByID (), FindByFirstName () et FindbyLastName () comme ceci: Student dynamique = typeof (étudiant); // étudiant dynamique = nouvel étudiant (); Student.FindbyFirstName = nouvelle action (() => {console.writeline ("Je suis une méthode de recherche et recherchez la table par firstName");});


et utiliser de cette façon: Dynamic Martin = nouvel élève (); martin.firstname = "martinho"; martin.lastname = "Fernandes"; martin.findbyfirstName ();