Je regarde dans de fortes fenêtres typées formes de la base de données en utilisant des méthodes d'extension. J'ai beaucoup de choses à suivre après l'aide de Xavier comme suit: maintenant Je peux configurer une base de données comme celle-ci: p> ou ceci: p> Il semble y avoir beaucoup de casting des expressions se passent cependant. Y a-t-il une meilleure façon? P> Edit: J'ai trouvé une meilleure façon, mais j'ai eu des difficultés à changer cette question à cette réponse - c'est
3 Réponses :
Qu'en est-il de définir le type de retour à l'objet?
Merci: cela compile, mais donne cette erreur d'exécution: impossible de lancer l'objet de type 'system.linq.expressions.unaryexpression' to tapez 'system.linq.expressions.memberexpression'.
Hmm. Je peux lancer l'ObjectLambda à une expression unaire, mais je ne vois pas comment obtenir le nom de la propriété de l'UNARYEXPRESSIVE .. (Le Controlambda est toujours une mémoire)
L'exception impossible d'installer l'objet de type 'system.linq.expressions.unaryexpression' to tapez 'system.linq.expressions.memberexpression'. Code> se produit généralement lorsque vous êtes des types de types plus dans votre fonction, car Exemple Lorsque vous avez
expression
x.id code> est en réalité de type
long code>.
J'utilise le code posté par Stuart pendant quelques mois maintenant. J'ai ajouté quelques surcharges supplémentaires pour correspondre au reste des scénarios de base de données que vous voudrez peut-être utiliser (je viens de le poster ici pour que d'autres puissent avoir un temps encore plus facile à faire fonctionner ce travail très utile)
public static class ControlExtensions { /// <summary>Databinding with strongly typed object names</summary> /// <param name="control">The Control you are binding to</param> /// <param name="controlProperty">The property on the control you are binding to</param> /// <param name="dataSource">The object you are binding to</param> /// <param name="dataSourceProperty">The property on the object you are binding to</param> public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty)); } public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty, bool formattingEnabled = false) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty), formattingEnabled); } public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty, bool formattingEnabled, DataSourceUpdateMode updateMode) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty), formattingEnabled, updateMode); } public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty, bool formattingEnabled, DataSourceUpdateMode updateMode, object nullValue) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty), formattingEnabled, updateMode, nullValue); } public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty, bool formattingEnabled, DataSourceUpdateMode updateMode, object nullValue, string formatString) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty), formattingEnabled, updateMode, nullValue, formatString); } public static Binding Bind<TControl, TDataSourceItem>(this TControl control, Expression<Func<TControl, object>> controlProperty, object dataSource, Expression<Func<TDataSourceItem, object>> dataSourceProperty, bool formattingEnabled, DataSourceUpdateMode updateMode, object nullValue, string formatString, IFormatProvider formatInfo) where TControl :Control { return control.DataBindings.Add(PropertyName.For(controlProperty), dataSource, PropertyName.For(dataSourceProperty), formattingEnabled, updateMode, nullValue, formatString, formatInfo); } public static class PropertyName { public static string For<T>(Expression<Func<T, object>> property) { var member = property.Body as MemberExpression; if(null == member) { var unary = property.Body as UnaryExpression; if(null != unary) member = unary.Operand as MemberExpression; } return null != member ? member.Member.Name : string.Empty; } } }
Ce code a bien fonctionné. Il a besoin d'une petite solution. Au lieu de contraindre à un «contrôle», il devrait être contraint de «ibindableComponent». C'est l'interface appropriée qui a la propriété «Databindingings».
Comme la question a été modifiée pour inclure une réponse, je comprends cette réponse ici. L'auteur aurait probablement dû quitter la question initiale seule et posté une réponse à sa propre question. Mais il semble être une très bonne solution.
EDIT: Je préfère cette solution que j'ai trouvée finalement dans le cache de Google (il a été supprimé de la Site de l'auteur ) car il n'a besoin que d'une spécification de type. Je ne sais pas pourquoi l'auteur d'origine l'a supprimé. P>
Ainsi a un format de réponse (s) de questions (s). Il est conçu de cette manière pour que les personnes ayant le même problème / question puissent rechercher des problèmes / des questions qu'ils ont, puis bénéficient de solutions ou suggèrent des solutions. Je suis ouvert à différents utilisateurs ayant des préférences stylistiques différentes, mais je suis fortement en désaccord avec votre ayant supprimé votre question initiale. La réponse avec laquelle vous avez remplacée il manque tout le contexte que la question prévoit. Ce faisant non seulement aller contre la conception de SO, mais cela rend également plus difficile pour les autres de bénéficier des informations contenues dans ce document.
Non, cela vient de mettre quelle était une réponse dans le bon endroit. Donc, si quelqu'un a décidé "D'accord, je pense que je crois comprendre ce que ce problème est à propos, je vais maintenant utiliser les réponses à voir s'il y a des bonnes" qu'ils pouvaient voir la bonne réponse que vous aviez incluse.
Avez-vous vu que je revenais votre question originale au début, puis votre réponse était après? (Et maintenant, seule la réponse reste comme si vous l'avez eue auparavant.) Je pensais peut-être que vous l'aviez peut-être retourné, mais peut-être qu'un administrateur l'a revenue. Je ne sais pas, j'essayais juste d'aider.
La première chose que j'ai dit était que j'avais copié le contenu de ma réponse de la question qui n'était plus une question. Je ne vois vraiment pas ton point.
Excuse-moi. Dans ma course à lire votre réponse, j'ai manqué que la question avait été retournée (que vous avez réellement dit, et j'ai mal interprété.) Je pense que la solution que vous avez incluse doit rester sous une forme, car c'était un bon. Si vous souhaitez le poster sous votre propre compte, veuillez le faire et je peux également supprimer ma réponse. Je veux juste que les gens bénéficient de l'amour-sandwich qui est tellement. N'oubliez-vous que les horribles jours où googling une question de programmation ne renvoyait que des réponses d'échange d'experts derrière un weblaz?
Cela a bien fonctionné pour moi et j'aime la solution. J'ai mis à jour la contrainte de type TControl pour utiliser ibindableComponent. Et le paramètre «Object DataSource» à utiliser 'TdataSourceItem DataSource », ce qui signifie que vous n'avez pas à jeter la fonction Lambda qui recherche les propres que vous souhaitez.
S'il vous plaît ne modifiez pas votre question dans une réponse. Si vous avez trouvé une solution, il doit aller dans la section Réponses. À une personne qui tente de parcourir rapidement les liens Google pour une solution, il est très désorientant de lire "d'accord, j'ai trouvé une solution" Sans même savoir quelle était votre question, ni de l'évaluer si elle est applicable au problème du visiteur.
Oh bien, je dois jouer par les règles ..
Il convient de noter que la nouvelle fonction de nom de nom () du C # 6 pourrait également être utilisée pour éviter d'utiliser une chaîne. msdn.microsoft.com/en-us/library/dn986596.aspx