2013-06-22 6 views
0

좋아, 그래서 이벤트가 트리거 될 때 전달할 수있는 EventArgs 관한 질문이 있습니다. 작고 기본적인 검색 엔진을 설계하고 검색이라는 메서드가 포함 된 Query라는 클래스가 있습니다. 이 메소드가 호출되면 다양한 캐시 클래스 인스턴스 (SizeBoundedCache 및 TimeBoundedCache)에 저장 될 결과를 전달할 이벤트를 트리거하려고합니다. 그래서 나는 이것을하기위한 최선의 방법이 사건을 사용하는 것이라고 생각했습니다.C# 이벤트 전달 인수

대리인은 다음과 같이 선언 ->

public delegate void CacheStoreDelegate(object sender, EventArgs e); 

이 질문에 대한 관련 쿼리 클래스 내 코드의 나머지 부분은 여기에 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; 
    } 
} 

모든 캐시 수업은 검색이 호출 될 때마다 통보 될 것이고 결과를 받기 위해서도 필요합니다.

미리 도움을 청합니다. 또한, 내가 생각하지 못하는 이것을하는 더 우아한 방법이 있다면, 안으로 차임하십시오. 건배!

답변

3

당신은 당신의 자신의 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)); 
+0

와우, 멋진 분! –

1

이 (

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; 
    } 
} 

다음 이벤트를 선언 형 CacheStoreEventArgs의 클래스가있는 EventArgs에서 파생 확인 미리 정의 된 일반적인 하나를 사용하므로 필요 없음 하나를 선언하는 것)

public event EventHandler<CacheStoreEventArgs> AddToCache; 

을 메소드 내부에서 검색하면 "On ...."이라고 부릅니다.

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 
    } 
}