2011-07-05 18 views
8

IoC kullanıyoruz ve günlüğe kaydetmemizi sağladık. Common.Logging kullanıyoruz ve Common.Logging.FormatMessageHandler için eşleşen bir temsilci yazdık ancak bu temsilci sürümümüzden Common.Logging api'nin beklediği sürüme nasıl dönüştürüleceğini bilmiyorum.Bir temsilci diğerine dönüştürün. Sözdizimli döküm

Bu soru benzer görünüyor, ancak uygulanan türümden aramak istediğim bilinen türe nasıl dönüştürüleceğini anlamıyorum. İşte

public delegate string FormatMessageHandler(string format, params object[] args) 


Common.Logging en geçerli::

public delegate string FormatMessageHandler(string format, params object[] args) 

aynı adı (değil önemli olan) ve parametrelerin aynı sayıda Dynamically casting one type of delegate to another

İşte benim temsilci imzadır. Her ikisi de derleme zamanında biliniyor, bu yüzden bariz bir şey olmalı ama ben onu görmüyorum.

cevap

7

Neden tam olarak aynı ise Common.Logging temsilcisini ilk etapta kullanmıyorsunuz?
Ancak, soruna bir Solüsyonu dinamik döküm Bahsettiğiniz söz konusu bağlantılı makalesinde açıklandığı kullanmak için her, ya da sen böyle yapmak:

YourNamespace.FormatMessageHandler yourHandler = ...; 
Common.Logging.FormatMessageHandler handler = (f, a) => yourHandler(f, a); 

GÜNCELLEME:
göre senin böyle bir şey istiyorum, yorum:

public void Error(Action<Your.FormatMessageHandler> formatMessageCallback) 
{ 
    _logger.Error(h => formatMessageCallback((f, a) => h(f, a))); 
} 

Bu ürünle eylemi çağıran tip Common.Logging.FormatMessageHandler arasında h tek bir parametre ile yeni bir eylem yaratacak ve a parametrelerini kabul eden yeni bir Your.FormatMessageHandler delegesi ile. Bu yeni delege, verilen iki parametre ile h'u çağırır.

+0

temelde aynı şekilde davranır harika ve ben Eylem kullanma girişiminde kadar çalışır. Eylem ile nasıl baş edebilirim? Benim yöntemim imzası: public void Hatası (Eylem formatMessageCallback) Ve çağırmak için son yöntemdir: geçersiz Common.Logging.Error (Eylem formatMessageCallback); –

+0

Common.Logging temsilcisini veya API'den herhangi birini ifşa etmeyeceğim. Gelecekte farklı bir kayıt çerçevesi kullanmaya karar verdik. Eğer böyle bir şey olursa, daha önce tanımladığımız kayıt arayüzünü uygulayan ve çağrıları yeni kayıt çerçevesine yansıtan bir kod yazmak zorundayız. –

+0

@David: Logger temsilcisini kullanmamanın nedeni geçerli, açıkladığın için teşekkürler. Lütfen ilk yorumunuza bir çözüm için güncellemeye bakın. –

1

El ile bunu yapabilirsiniz, ancak dönüşümde yer alan yansıma kadar pahalıdır. temsilci dönüştürüldükten sonra açıklamak Sizin ...

internal class Program 
{ 
    //An example delegate target 
    static void Click(object o, EventArgs e) { } 

    //A simple test method 
    static void Main(string[] args) 
    { 
     EventHandler onclick = Click; 
     EventHandler<EventArgs> converted; 
     if (!TryConvertDelegate(onclick, out converted)) 
      throw new Exception("failed"); 
    } 

    //The conversion of one delegate type to another 
    static bool TryConvertDelegate<TOldType, TNewType>(TOldType oldDelegate, out TNewType newDelegate) 
     where TOldType : class, System.ICloneable, System.Runtime.Serialization.ISerializable 
     where TNewType : class, System.ICloneable, System.Runtime.Serialization.ISerializable 
    { 
     if (!typeof(Delegate).IsAssignableFrom(typeof(TOldType)) || !typeof(Delegate).IsAssignableFrom(typeof(TNewType))) 
      throw new ArgumentException(); //one of the types is not a delegate 

     newDelegate = default(TNewType); 
     Delegate handler = oldDelegate as System.Delegate; 
     if (handler == null) 
      return true; //null in, null out 

     Delegate result = null; 
     foreach (Delegate d in handler.GetInvocationList()) 
     { 
      object copy = System.Delegate.CreateDelegate(typeof(TNewType), d.Target, d.Method, false); 
      if (copy == null) 
       return false; // one or more can not be converted 
      result = System.Delegate.Combine(result, (System.Delegate)copy); 
     } 
     newDelegate = result as TNewType; 
     return (newDelegate != null); 
    } 
İlgili konular