我有一種情況,即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);
}
};
它會更容易回答的問題,如果你提供了一些代碼,包括你想用到底該怎麼做了'// ???'在部分你不知道。 –
隨着代碼,我現在可以跟隨你的設置,但我不知道它爲什麼失敗。請添加一個你想要的'Dictionary'和'Invoke()'調用的例子。 – Bobson
嗯...我認爲你最好的答案是將存儲所有這些屬性的自定義對象替換字典。這是可行的嗎? – Bobson