PDA

View Full Version : حرفه ای: توضیح Delegate Expression این کد ؟



Afshin160
شنبه 20 دی 1393, 10:55 صبح
با سلام
یه توضیح می خواستم در رابطه با این دو خط کد :


public interface IMessageArchiver : IDisposable
{
int Update(IEnumerable<Database.Message> messages);
IList<Database.Message> Select(Expression<Func<Database.Message, bool>> predicate);
}

mreram
یک شنبه 21 دی 1393, 00:37 صبح
سلام

IMessageArchiver یک اینترفیس هست که از اینترفیس idisposable مشتق شده... به طور خلاصه Idisposable برای آبجکت هایی استفاده میشه که وقتی کارمون باهاشون تموم شد اجراشون متوقف بشه
public interface IMessageArchiver : IDisposable
{
یک متد تعریف شده (در اینترفیس متد فقط تعریف میشه پیاده سازی نمیشه یعنی بدنه نداره)به اسم update که یک پارامتر از نوع ienumerable جنریک تعریف شده که نوع جنریکش database.messageهست به نام messages
int Update(IEnumerable<Database.Message> messages);
یک لیست جنریک از نوعDatabase.Message
IList<Database.Message> Select(Expression<Func<Database.Message, bool>> predicate);
}

Afshin160
یک شنبه 21 دی 1393, 20:08 عصر
mreram (http://barnamenevis.org/member.php?303886-mreram) ممنون .
ولی بیشتر منظور من
IList<Database.Message> Select(Expression<Func<Database.Message, bool>> predicate);

وخصوصا"Expression
است .متشکر میشم دوستان کمک کنن

mreram
یک شنبه 21 دی 1393, 21:06 عصر
خواهش میکنم .. اگر شما توضیحات بنده رو متوجه شدی اینم چیزه خاصی نیست
linq expression هست
این یک متد هست به نام select از نوع اینترفیس ilist که یک پارمتر داره
IList<Database.Message> Select(Expression<Func<Database.Message, bool>> predicate);
پارامترش دو مقداری هست یعنی اندیسش از نوع Database.Message و مقدارش bool چون Expression تعریف شده از نوع lambda Expression هست

plus
یک شنبه 21 دی 1393, 21:18 عصر
mreram (http://barnamenevis.org/member.php?303886-mreram) ممنون .
ولی بیشتر منظور من
IList<Database.Message> Select(Expression<Func<Database.Message, bool>> predicate);

وخصوصا"Expression
است .متشکر میشم دوستان کمک کنن
این متد، یک Expression Tree برای یک متد که ورودیش Database.Message هست و خروجی bool داره میگیره و لیستی از Database.Message ها رو فراخوانی میکنه.
اینطور که از اسم ها پیداست، این متد شبیه یک Select از دیتابیسه که فراخواننده این متد، آرگومانی از نوع Express که نقش فیلتر کننده Message ها رو داره به این متد ارائه میده و متد Message هایی که با فیلتر ارائه شده تطابق داره رو برمیگردونه.
برای مثال من یک کلاس Message با یک مشخصه Title تعریف کردم.اگه کلاسی با نام MessageArchive این interface رو پیاده کرده باشه، با این کد، Message هایی با عنوان Programming رو میتونید از Archive دریافت کنید:

class Program {
class Message {
public string Title {
get;
set;
}
}
interface IMessageArchiver : IDisposable {
int Update(IEnumerable<Message> messages);
IList<Message> Select(Expression<Func<Message, bool>> predicate);
}
static void Main(string[] args) {
Expression<Func<Message, bool>> filter = message => message.Title.Contains("Programming");
IMessageArchiver messageArchiver = new MessageArchive();
IList<Message> messagesContainProgramming = messageArchiver.Select(filter);
Console.WriteLine("Messages that their title contain 'Programming' are:");
foreach (Message message in messagesContainProgramming) {
Console.WriteLine(message.Title);
}
}
}