2016-02-19 1 views
0

Je veux convertir Expression<Func<Loan, bool>> en chaîne et vice versa. puis-je le faire? comment peut mettre en œuvre la méthode ConvertStringToExpression?Convertir l'expression <Func <T, bool>> en chaîne et vice versa En C#

internal class Program 
{ 
    public class Loan 
    { 
     public bool IsActive { get; set; } 
    } 

    private static void Main(string[] args) 
    { 
     Expression<Func<Loan, bool>> expression = l => !l.IsActive; 

     var expStr = ConvertExpressionToString(expression); 

     var exp = ConvertStringToExpression(expStr); 
    } 

    public static string ConvertExpressionToString(Expression<Func<Loan, bool>> expression) 
    { 
     //return ??? 
     throw new NotImplementedException(); 
    } 

    public static string ConvertStringToExpression(string expression) 
    { 
     //return ??? 
     throw new NotImplementedException(); 
    } 
} 
+1

Comment voulez-vous que cela fonctionne ?? Et plus important encore, pourquoi voudriez-vous faire cela? –

+0

En résumé: vous devrez analyser la chaîne à l'aide de 'Microsoft.CodeAnalysis.CSharp.SyntaxFactory', obtenir (plus probablement)' Microsoft.CodeAnalysis.CSharp.Syntax.SimpleLambdaExpressionSyntax', obtenir l'expression en fonction de ce que vous y mettez et se termine par une 'System.Linq.Expressions.LambdaExpression'. – Mark

+0

@DavidL Je veux enregistrer des expressions en tant que chaîne (pas xml) dans la base de données. – ArMaN

Répondre

0

Vous pouvez utiliser la bibliothèque DynamicLinq comme détaillé dans blog de ScottGu il y a longtemps. Cette bibliothèque a une classe ExpressionParser qui a tout le composant de l'infrastructure d'analyse pour analyser les expressions de chaîne et les convertir en Expression.

est ici un de l'utilisation:

public static Expression Parse(Type resultType, string expression, params object[] values) 
    { 
     ExpressionParser parser = new ExpressionParser(null, expression, values); 
     return parser.Parse(resultType); 
    } 

J'ai créé un point essentiel pour la bibliothèque de fichiers unique here. Mais vous pouvez également télécharger le contenu complet here.

+0

Cela ne résout pas le problème de l'OP, car il ne prend pas juste une chaîne de caractères, il veut pouvoir stocker une chaîne et recréer Expression basée sur cette chaîne –

+0

Ce n'est pas aussi simple que penser OP ... comment le type Expression connaîtrait le type de Lambda Cela pourrait être possible mais cela se ferait par réflexion et cela signifie qu'il y aura une réflexion à partir de là. Aussi thi La bibliothèque s est assez ancienne et pourrait ne pas être capable de générer du lambda complet. Mais la bibliothèque serait un bon endroit pour commencer. – vendettamit

+0

Je ne suis pas en désaccord avec Whatsover :). Ceci est absolument plus compliqué que les attentes du PO. Cela dit, cela ne le résout toujours pas pour l'OP. –