এটি মূল সমস্যার একটি সরলীকৃত সংস্করণ।
আমার একটি ব্যক্তি নামে একটি ক্লাস রয়েছে:
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
আমি এই স্ট্রিংটি এবং আমার অবজেক্টটি ধরতে চাই এবং সত্য বা মিথ্যা মূল্যায়ন করতে চাই - অর্থাত্ বস্তুর উদাহরণে একটি ফানক <ব্যক্তি, বুল> এর মূল্যায়ন।
এখানে আমার বর্তমান চিন্তাভাবনাগুলি:
- বেসিক তুলনা এবং লজিকাল অপারেটরদের সমর্থন করতে এএনটিএলআরে একটি বেসিক ব্যাকরণ প্রয়োগ করুন। আমি ভিজ্যুয়াল বেসিক অগ্রাধিকার এবং কিছু ফিচারসেট এখানে অনুলিপি করার কথা ভাবছি: http://msdn.microsoft.com/en-us/library/fw84t893(VS.80).aspx
- এএনটিএলআরকে সরবরাহিত স্ট্রিং থেকে উপযুক্ত এএসটি তৈরি করতে হবে।
- এএসটি চলুন এবং গতিশীলভাবে ফানক <ব্যক্তি, বুল> তৈরি করতে প্রিডিকেট বিল্ডার কাঠামোটি ব্যবহার করুন
- প্রয়োজনীয় হিসাবে ব্যক্তির একটি উদাহরণের বিরুদ্ধে শিকারীর মূল্যায়ন করুন
আমার প্রশ্ন হ'ল আমি কি একেবারে উপচে পড়েছি? কোন বিকল্প?
সম্পাদনা: নির্বাচিত সমাধান
আমি ডাইনামিক লিনক লাইব্রেরিটি ব্যবহার করার সিদ্ধান্ত নিয়েছি, বিশেষত লাইনকিউ নমুনায় প্রদত্ত ডায়নামিক ক্যোয়ারী ক্লাস।
নীচে কোড:
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();
}
}
}
ফলাফল টাইপ সিস্টেম.বুলিয়ান, এবং এই উদাহরণে সত্য।
মার্ক গ্র্যাভেলকে অনেক ধন্যবাদ।
এখানে সিস্টেম.লিনক.ডায়নামিক নুগেট প্যাকেজ, ডকুমেন্টেশন অন্তর্ভুক্ত করুন