簡體   English   中英

如何使用javascript擴展樣式擴展動態c#對象?

[英]How to extend dynamic c# object in javascript extend style?

**這是一個自我回答的問題,因為我找到了解決方案,但是我在這里找不到它**

用例

必須使用HTTP將來自應用程序A (C#后端)的未明確定義的結構化數據傳遞到應用程序B (SignalR前端的ASP.Net C#應用程序),該操作將使用SignalR將消息簡單地傳遞到javascript客戶端。

該數據用於實時記錄。

為什么不創建類? 因為傳入的數據可以更改,所以不必由應用程序B進行分析,並且不能在兩端(C#/ JavaScript)之間共享每個類的代碼。

另外,我希望能夠執行以下操作:

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

使用expando對象

由於無法輕松修改動態對象,因此需要使用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);產生的參數JObject.Parse(jsonText); 例如,因為它將不得不從中讀取屬性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM