[英]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);
由於無法輕松修改動態對象,因此需要使用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.