Rufen Sie die statische Methode in expression.call mit Argumenten auf

.net c# delegates expression-trees lambda

Frage

Ich habe die String-Klasse für die Methode Contains . Ich versuche, es in Expression.Call zu nennen, aber wie das Argument richtig übergeben?

Code: String Enthält Methode:

public static class StringExts
{
    public static bool NewContains(this string source, string ValToCheck, StringComparison StrComp)
    {
        return source.IndexOf(ValToCheck, StrComp) >= 0;
    }
}

In Ausdruck ruft als:

public class Person { public string Name {get; set;} }

public class Persons { 
    public List<Person> lstPersons {get; set;} 
    public Persons() {
      lstPersons = new List<Person>();    
    }
}

public class Filter 
{
    public string Id { get; set; }
    public Operator Operator { get; set; }
    public string value { get; set; }
}

public void Main()
{
   //Get the json.
   //"Filters": [{"id": "Name", "operator": "contains", "value": "Microsoft"}]

    Filter Rules = JsonConvert.DeserializeObject<Filter>(json);

   // Get the list of person firstname.
    List<Person> lstPerson = GetFirstName();

   ParameterExpression param = Expression.Parameter(typeof(Person), "p");
   Expression exp = null;

   exp = GetExpression(param, rules[0]);

   //get all the name contains "john" or "John"
   var filteredCollection = lstPerson.Where(exp).ToList();

}

private Expression GetExpression(ParameterExpression param, Filter filter){
   MemberExpression member = Expression.Property(param, filter.Id);
   ConstantExpression constant = Expression.Constant(filter.value);

   Expression bEXP = null;

   switch (filter.Operator)
    {
         case Operator.contains:
           MethodInfo miContain = typeof(StringExts).GetMethod("NewContains", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
           return  Expression.Call(miContain, member, constant , Expression.Constant(StringComparison.OrdinalIgnoreCase));; 
           break;
    }
 }

Error:

Eine nicht behandelte Ausnahme vom Typ 'System.ArgumentException' ist in System.Core.dll aufgetreten.Zusätzliche Informationen: Die statische Methode erfordert eine Nullinstanz, die nicht statische Methode erfordert eine Nicht-Null-Instanz.

Wie ruft man den Parameter in miContain für folgende Call() Methoden auf?

Ich habe den Kodex aktualisiert.

Akzeptierte Antwort

Sie geben nicht alle Parameter an. Wenn Sie Ausdrücke für alle erstellen, funktioniert es:

ParameterExpression source = Expression.Parameter(typeof(string));
string ValToCheck = "A";
StringComparison StrComp = StringComparison.CurrentCultureIgnoreCase;

MethodInfo miContain = typeof(StringExts).GetMethod("NewContains", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static);
var bEXP = Expression.Call(miContain, source, Expression.Constant(ValToCheck), Expression.Constant(StrComp));

var lambda = Expression.Lambda<Func<string, bool>>(bEXP, source);

bool b = lambda.Compile().Invoke("a");

Beliebte Antwort

Sie haben nicht genügend Argumente angegeben (2 vs. 3). NewContains hat drei Argumente.

Da es sich bei dieser Methode nicht um eine Instanzmethode handelt, können Sie den Parameter this nicht festlegen. Diese Überladung sieht besser aus.

Sie sollten die Überladungsliste wahrscheinlich untersucht haben. So habe ich die richtige Antwort auf diese Frage gefunden, ohne sie vorher selbst zu kennen.



Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum