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(); } } }
4 Réponses :
Il n'y a pas de "ceci" disponible pour vous. P>
Capturez l'objet lors de la création de la Lambda à la place: P>
alors ça marche. p> étudiant.Introduction = nouvelle action (
() =>
Console.writeline ("Bonjour mon nom est {0} {1}", étudiant.firstName, étudiant.lastname)
); code> p>
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); };
Vous ne pouvez pas utiliser sortie: p> ce mot-clé code> dans l'action, car ici
ce code> 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:
Eh bien, vous utilisez Même si vous étiez dans une méthode d'instance, cela ne fonctionnerait pas avec Vous devez faire référence à expandoObject (étudiant): P> 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.
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>
student.Introduction=new Action(()=>
Console.WriteLine("Hello my name is {0} {1}",student.FirstName,student.LastName);
);
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
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 ();