यह मूल समस्या का एक सरलीकृत संस्करण है।
मेरे पास व्यक्ति नामक एक वर्ग है:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
... और एक उदाहरण देता है:
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
मैं अपने पसंदीदा पाठ संपादक में एक स्ट्रिंग के रूप में निम्नलिखित लिखना चाहूंगा ...।
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
मैं इस स्ट्रिंग और मेरे ऑब्जेक्ट इंस्टेंस को लेना चाहता हूं और ऑब्जेक्ट उदाहरण पर एक TRUE या FALSE का मूल्यांकन करता हूं - अर्थात फंक <व्यक्ति, बूल> का मूल्यांकन करना।
यहाँ मेरे वर्तमान विचार हैं:
- बुनियादी तुलना और तार्किक ऑपरेटरों का समर्थन करने के लिए ANTLR में एक बुनियादी व्याकरण को लागू करें। मैं विज़ुअल बेसिक मिसाल और यहाँ कुछ सुविधाओं को कॉपी करने की सोच रहा हूँ: http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
- उपलब्ध स्ट्रिंग से ANTLR एक उपयुक्त एएसटी बनाएं।
- एएसटी वॉक करें और प्रेडिकेटेट बिल्डर का उपयोग करें गतिशील रूप से फंक <व्यक्ति, बूल> बनाने के लिए फ्रेमवर्क का
- आवश्यकतानुसार व्यक्ति के उदाहरण के खिलाफ विधेय का मूल्यांकन करें
मेरा सवाल यह है कि क्या मैंने इस पर पूरी तरह से काबू पा लिया है? कोई विकल्प?
संपादित करें: चुना समाधान
मैंने डायनेमिक Linq लाइब्रेरी का उपयोग करने का निर्णय लिया, विशेष रूप से LINQSamples में उपलब्ध डायनेमिक क्वेरी क्लास।
नीचे कोड:
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 = System.Linq.Dynamic.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();
}
}
}
परिणाम प्रकार System.Boolean का है, और इस उदाहरण में TRUE है।
मार्क ग्रेवल को बहुत धन्यवाद।
शामिल System.Linq.Dynamic nuget पैकेज, प्रलेखन यहाँ