Orchard 事件通知小坑

public void GetTagLogRecord(int tagId, string keyword, string area) {
            var tag = _repositoryTagRecord.Get(tagId);
            OnlineGet(tag, keyword, area);
        }

  

_jobsQueueService.Enqueue("IClawerService.GetTagLogRecord", new Dictionary<string, object> {
                                { "tagId", tag.Id }
                                , { "keyword", tag.Keyword }
                                , { "area", area }
                            }, 1);

 

if (cachedDelegate != null) {
                var args = cachedDelegate.Item1.Select(methodParameter => arguments[methodParameter.Name]).ToArray();
    //此处args为object[]数组,调用下面的一句话始终报转换无效的错误,
//调试时将args手动构造成 args = new object[] { 23, "PPAPI", "" };又没问题 !!!!!!
//不知道是不是.NET的bug !!!
                var result = cachedDelegate.Item2(eventHandler, args);

                returnValue = result as IEnumerable;
                if (result != null && (returnValue == null || result is string))
                    returnValue = new[] { result };
                return true;
            }    

  

否则  cachedDelegate.Item2  始终报错 :  指定的转换无效 !!!!!

2015.10.14最新进展

根本原因分析,入参字典   tagId 传入 int类型 9

在orchard反解析的过程中  会将数值类型转换为 long

private static object Convert(this JToken jToken) {
            if (jToken == null) {
                throw new ArgumentNullException();
            }

            switch (jToken.Type) {
                case JTokenType.Array:
                    var array = jToken as JArray;
                    return array.Values().Select(Convert).ToArray();
                case JTokenType.Object:
                    var obj = jToken as JObject;
                    return obj
                        .Properties()
                        .ToDictionary(property => property.Name, property => Convert(property.Value));
                default:
//这里会将9 转换为long类型
                    return jToken.ToObject<object>();
            }
        }

  解决办法 :   入参字典统一传没有类型歧义的  string !!!!!!

posted @ 2015-10-14 03:00  白菜89  阅读(440)  评论(0编辑  收藏  举报