2014-05-05 19 views
1

我有一種情況,即System.Dynamic容器必須將字符串中的類型存儲到對象。存儲的類型是一個通用代理。我需要重新構造類型才能調用委託。C#如何將通用委託類型轉換爲對象並返回

我知道基於存儲的對象是已知的通用委託類型的關鍵。我無法弄清楚如何爲它建立一個調用。在VS調試器中,查看對象類型的專用類型是已知的(通過反射),並且通用委託類型是已知的。

UPDATE:

public delegate void MessageHandlerFunction<in T>(IMessage<T> msg, MessageReceivedInfo info); 

其中T是接口

public interface ISpecificMessage 
{ 
    string SiteName { get; set; } 
    DateTime MessageTimeStamp { get; set; } 
    long MessageNumber { get; set; } 
    Guid? PersonId { get; set; } 
    DateTime? CreateTimeStamp { get; set; } 
    DateTime? ModifyTimeStamp { get; set; } 
    int? CreateTimeStampTz { get; set; } 
    int? ModifyTimeStampTz { get; set; } 
    int? CreateUserId { get; set; } 
    int? ModifyUserId { get; set; } 
    Dictionary<string, object> Payload { get; set; } 
} 


[Serializable] 
public class SpecificMsg1 : SpecificMessage 
{ 
} 

[Serializable] 
public class SpecificMsg2 : SpecificMessage 
{ 
} 

每個混凝土代表

private void ProcessSpecificMsg1(IMessage<SpecificMsg1> msg, MessageReceivedInfo info) 
    { 
     _logger.InfoWrite("received message: SpecificMsg1 from siteName: {0}", msg.Body.SiteName); 
    } 

的實現我必須存儲該委託函數在一個字典

後來,當在一個System.Threading.Task中運行時,我需要重建委託並調用它。

var context = new Dictionary<string,object>(); 
context["MessageHandlerFunction"] = ProcessSpecificMsg1; 
context["Msg"] = msg; 
context["Info"] = info; 

public class Runner 
{ 
    public void Run(Dictionary<string,object> ctx) 
    { 
     var mhf = ctx["MessageHandlerFunction"]; 
     MessageReceiveInfo info = ctx["Info"] as MessageReceiveInfo; 
     var msg = ctx["Msg"]; 

     // mhf is an object type but was a delegate to a specific specialization of generic delegate. 

     // How to cast to correct delegate type and call it at runtime via reflection is the question. 

     ((MessageHandlerFunction<>)mhf)(msg,info); 
    } 
}; 
+4

它會更容易回答的問題,如果你提供了一些代碼,包括你想用到底該怎麼做了'// ???'在部分你不知道。 –

+0

隨着代碼,我現在可以跟隨你的設置,但我不知道它爲什麼失敗。請添加一個你想要的'Dictionary'和'Invoke()'調用的例子。 – Bobson

+0

嗯...我認爲你最好的答案是將存儲所有這些屬性的自定義對象替換字典。這是可行的嗎? – Bobson

回答

0
var message = msg as SpecificMsg1; 

if (message != null) 
{ 
    // do stuff.. 
} 
+0

我想這不是很清楚,但有大約30個專業,其中每個有不同的過程功能。作爲對象存儲在集合中的委託是指向相應過程函數的函數指針。問題是將一個對象的類型是對象,但是先驗知識是對特定過程函數的通用委託。 – weidson

相關問題