[英]C# Event Argument passing
好的,所以我有一個關於觸發事件時可以傳遞的EventArgs的問題。 我正在設計一個小的基本搜索引擎,並且有一個名為Query的類,其中包含搜索方法。 調用此方法時,我想觸發一個事件,該事件將結果存儲在各種緩存類實例(SizeBoundedCache和TimeBoundedCache)中。 所以我認為最好的方法是使用一個事件。
像這樣聲明委托->
public delegate void CacheStoreDelegate(object sender, EventArgs e);
Query類中與此問題相關的其余代碼在這里(使用Linq)->
public event CacheStoreDelegate AddToCache;
public virtual void OnQuery (EventArgs e)
{
if(AddToCache != null)
AddToCache(this, e);
}
public Query()
{
}
public Query(string queryString, OOP5.Provided.QueryOperator op)
{
//Access and set the terms array
this.Terms = OOP5.Provided.QueryUtils.GetTermsFromString(queryString);
this.Operator = op;
}
public static IEnumerable<string> Search (this SearchCore s, IQuery q)
{
// Accept a query and return IEnumerable<string> of
// all document IDs matching that query
if (q.Operator == QueryOperator.Any)
{
var GetAnyMatch = from single_query in q.Terms
group s.Search(single_query)
by s.documents.Keys
into results
where results.Count >= 1
select results[0];
this.OnQuery(GetAnyMatch);
return GetAnyMatch;
}
if (q.Operator == QueryOperator.All)
{
var GetAllMatch = from single_query in q.Terms
group s.Search(single_query)
by s.documents.Keys
into results
where results.Count >= q.Terms.Lengthselect results[0];
this.OnQuery(GetAllMatch);
return GetAllMatch;
}
}
每當調用搜索時,所有緩存類都會收到通知,我也需要thme來接收結果。
非常感謝您的幫助。 另外,如果有一種我沒有想到的更優雅的方法,請發出提示。干杯!
您可以創建自己的EventArgs實現 :
class QueryResultEventArgs : EventArgs
{
public IEnumerable<string> Results { get; private set; }
public QueryResultEventArgs(IEnumerable<string> results)
{
Results = results;
}
}
...
public delegate void CacheStoreDelegate(object sender, QueryResultEventArgs e);
...
this.OnQuery(new QueryResultEventArgs(GetAnyMatch));
制作一個從eventargs派生的CacheStoreEventArgs類型的類
public class CacheStoreEventArgs:eventargs
{
private IEnumerable<string> Data;//List<string> better
public IEnumerable<string> data
{
get { return Data; }
set { this.Data = value; }
}
public CacheStoreEventArgs(IEnumerable<string> NewData)
{
this.data = NewData;
}
}
然后聲明事件(使用預定義的通用事件,因此無需聲明一個)
public event EventHandler<CacheStoreEventArgs> AddToCache;
在方法搜索中,您將方法稱為“開...”。
public static IEnumerable<string> Search (this SearchCore s, IQuery q)
{
//after you get query result
CacheStoreEventArgs cs = new CacheStoreEventArgs(queryresultvariablehere);
//and call your method now with the instance of your derived eventargs class
OnQuery(cs);
}
public virtual void OnQuery (CacheStoreEventArgs e)
{
try
{
EventHandler<CacheStoreEventArgs> temp = AddToCache
if( temp != null)
temp(this,e);
}
catch(Exception ex)
{
//exception handling
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.