【问题标题】:How to extend dynamic c# object in javascript extend style?如何以 javascript 扩展样式扩展动态 c# 对象?
【发布时间】:2016-12-02 11:14:41
【问题描述】:

** 这是一个自我回答的问题,因为我找到了解决方案,但在这里没有找到 **

用例

必须将来自 Application A(C# 后端)的未明确定义的结构化数据传递给 Application B(SignalR 前端的 ASP.Net C# 应用程序) ) 使用 HTTP,它将使用 SignalR 将消息简单地传递到 javascript 客户端。

数据用于实时登录。

为什么不创建类? 因为传入的数据是可以改变的,不必由Application B分析,每个类的代码也不能在两端(C#/JavaScript)之间共享。

另外,我希望能够做这样的事情:

var foo = DynamicExtend(
    new { propExtendedFromDynamic1 = true }, 
    new { propExtendedFromDynamic2 = true }
);
string jsonText = Newtonsoft.Json.JsonConvert.SerializeObject(foo);
dynamic unserializedFoo = JObject.Parse(jsonText);

【问题讨论】:

    标签: javascript c# .net json expandoobject


    【解决方案1】:

    使用扩展对象

    由于动态对象不易修改,需要使用ExpandoObject。

    唯一的缺点是它不能完成具有其他动态属性的原始动态对象,并且仍然使用与 $.extend(true, {p1:1},{p2:2}) 相同的引用(如果您了解 jQuery,您会理解)。

    public static dynamic DynamicExtend(params dynamic[] extendedItems)
    {
            if (extendedItems == null || extendedItems.Length == 0 || extendedItems[0] == null)
                throw new Exception("Missing initial dynamic property");
    
            if (extendedItems.Length == 1)
                return extendedItems.First();
    
            dynamic r = new ExpandoObject();
            // We will need that casted value or the r[propertyName]="someValue" will fail
            var dynamicReturnedEditable = (IDictionary<string, object>)r;
    
            // For each dynamic object passed in
            foreach (dynamic extensionHolder in extendedItems)
            {
                var expandoCase = extensionHolder as IDictionary<string, object>;
                if (expandoCase == null)
                {
                    // Pour chaque propriété
                    foreach (var property in ((object)extensionHolder).GetType().GetProperties())
                    {
                        // Faire la copie sur l'ExpandoObject (qui gère nativement le rajout de propriété) en utilisant les données extraites de l'objet dynamique
                        dynamicReturnedEditable[property.Name] = property.GetValue(extensionHolder, null);
                    }
                }
                else
                {
                    foreach (var propertyName in expandoCase.Keys)
                    {
                        // Faire la copie sur l'ExpandoObject (qui gère nativement le rajout de propriété) en utilisant les données extraites de l'objet dynamique
                        dynamicReturnedEditable[propertyName] = expandoCase[propertyName];
                    }
                }
            }
    
            return r;
    }
    

    注意:它不支持例如 JObject.Parse(jsonText); 产生的参数,因为它必须从中读取属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-12
      • 2020-02-01
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      相关资源
      最近更新 更多