我有以下情況。
我有一堆簡單的類,例如這個如何實現僅在運行時期間已知的驗證規則
public class Student
{
public int Id { get; set; }
public int Age { get; set; }
public decimal AverageMark { get; set; }
public string Name { get; set; }
public string University { get; set; }
}
有網頁爲他們每個人的地方,用戶可以創建,編輯和刪除。當我們創建更新它的學生時,我們需要驗證它。 問題是,我們不知道編譯期間的驗證規則!
我們爲管理員設置了獨立的網頁,例如他設置了驗證標準 ,學生年齡不能小於15歲,或者大學必須與「某些大學」平等。
至於結果,我都存儲在我的數據庫
public class Criteria
{
public string PropertyName { get; set; }
public string OperationName { get; set; }
public string OperationValue { get; set; }
}
我已經創建了一個調查的目的簡單的控制檯應用程序審覈規定的一些列表。這裏是代碼
namespace DynamicValidation
{
class Program
{
static void Main(string[] args)
{
//set up students
var student1 = new Student() { Age = 20, AverageMark = 4, Name = "Ihor", University = "Lviv National University" };
var student2 = new Student() { Age = 20, AverageMark = 4, Name = "Taras", University = "Lviv National University" };
var student3 = new Student() { Age = 20, AverageMark = 5, Name = "Marko", University = "" };
var student4 = new Student() { Age = 20, AverageMark = 3, Name = "Tanya", University = "" };
var student5 = new Student() { Age = 22, AverageMark = 4, Name = "Ira", University = "" };
var students = new List<Student>() { student1, student2, student3, student4, student5 };
//set up validation rules
var criteria1 = new Criteria("Age", "Equal", "20");
var criteria2 = new Criteria("AverageMark", "NotLessThan", "4");
var criteria3 = new Criteria("University", "Contains", "Lviv");
var criterias = new List<Criteria>() { criteria1, criteria2, criteria3 };
var result = new List<Student>();
foreach (var currentStudent in students)
{
foreach (var currentCriteria in criterias)
{
object currentPropertyValue = typeof(Student).GetProperty(currentCriteria.PropertyName).GetValue(currentStudent);
//what is next ???!!!
}
}
}
}
public class Student
{
public int Id { get; set; }
public int Age { get; set; }
public decimal AverageMark { get; set; }
public string Name { get; set; }
public string University { get; set; }
}
public class Criteria
{
public string PropertyName { get; set; }
public string OperationName { get; set; }
public string OperationValue { get; set; }
}
}
我如何能實現這一段代碼? (表情樹,動態?)
我不希望你爲我工作,但也許有一些關於這方面的文章? (我試圖找到但沒有成功)
也許一些關於方法的建議? 也許有一些類似的開放代碼?
或者也許它已經在一些圖書館實施?
將感謝任何幫助:)
表達式樹將是最好的方式 –
邊注:請求/存儲年齡通常是一個壞主意。獲得DOB然後*計算*年齡通常要合理得多(至少,如果數據預計將保持超過24小時有效) –
@Damien_The_Unbeliever。你是完全正確的。我會考慮這個 – Disappointed