Nasıl eşdeğer İfade Ağaç bir Dize dönüştürmek için?
Bu orijinal problemin daha basit bir versiyonu.
Bir sınıf İnsan aradım:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
...ve sağlar bir örneği de ki:
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
Bir olarak şunları yazmak istiyorumstringbenim favori metin editörü....
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
Bu dize ve bir nesne örneği ele alalım ve ya - yani bir İşlev değerlendirme<Kişinin, bool TRUE YANLIŞ bir^ değerlendirmek istiyorum . nesne örneği.
Şu anki düşüncelerim:
- ANTLR temel dilbilgisi temel Karşılaştırma ve Mantıksal Operatörler için destek uygulamak. Visual Basic öncelik ve featureset bazılarını burada kopyalama düşünüyorum: http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
- ANTLR sağlanan bir dize uygun bir AST oluşturun.
- AST yürüyüş ve dinamik olarak İşlev< oluşturmak için Predicate Builder çerçeve kullanmak;Kişi, bool>
- Gerekli Kişi örneğine karşı yüklem değerlendirin
Benim sorum tamamen overbaked var? herhangi bir alternatif?
DÜZENLE: Seçilen Çözüm
Dinamik Etmeniz Kütüphane kullanmak için, özellikle Dinamik Sorgu sınıf LİNQSamples verilen karar verdim.
Aşağıdaki kodu için:
using System;
using System.Linq.Expressions;
using System.Linq.Dynamic;
namespace ExpressionParser
{
class Program
{
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
static void Main()
{
const string exp = @"(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3";
var p = Expression.Parameter(typeof(Person), "Person");
var e = DynamicExpression.ParseLambda(new[] { p }, null, exp);
var bob = new Person
{
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = new DateTime(2000,1,1)
};
var result = e.Compile().DynamicInvoke(bob);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
Sonuç tipi Sistemi.Boolean, ve bu durumda DOĞRUDUR.
Marc Gravell için çok teşekkürler.
CEVAP
dynamic linq library yardım istiyorsunuz? Özellikle, Where
bir madde olarak düşünüyorum. Gerekirse, dizi/bir liste içinde sadece .Where(string)
aramayı bırak! yani
var people = new List<Person> { person };
int match = people.Where(filter).Any();
Değilse, yazılı bir çözümleyici (kullanarak Expression
başlık altında) değil, oldukça yıpratıcı - ben de bir tane yazdım benzer (her ne kadar ben olduğunu sanmıyorum kaynak) trenim gidip hemen önce xmas...
Nasıl bir dize dönüştürmek için yığın ...
Nasıl Ruby alt veya üst durumda bir di...
Nasıl dize Python küçük harfe dönüştür...
Bayt dönüştürmek için [nasıl] dize?...
Java nasıl bir dize bir karakter dönüş...