从字符串中的属性创建对象

本文关键字:属性 创建对象 字符串 | 更新日期: 2023-09-27 18:32:44

对象,具有类似 JSON 的表示法字符串中的其他属性。方法将从 Razor 视图调用以将共模传递给 jqgrid作为 JSON 对象,如

@Html.Raw( Json.Encode( Model.GetColModel()))

方法应该有签名,如

object GetColModel(string colName, int colWidth, string additonalProperties)

例如

GetColModel("customer", 17, "address='"Toronto'", index=1555" )

应返回对象

new { colName="customer", colwidth=17, address="Toronto", index=1555 }

可能有嵌套属性,如 JSON、eq。

GetColModel("customer", 17, "formatoptions= new { formatter='"number'", editable=true } " )

应返回对象

new { colName="customer", colwidth=17, formatoptions=new {
                   formatter="number", 
                   editable=true
                   }
}

我试过方法

    public object GetColModel(string colName, int colWidth, string additonalProperties)
    {
        return new
        {
            name = colName,
            width = colWidth,
            &addtitionalProperties
        };
    }

但这失败了,因为 C# 不支持宏

如何创建这样的方法或其他方法将属性从数据库添加到 Razor 视图中串的 json 中?

它是从 C# MVC 4 视图模型调用 ASP.NET/Mono。使用Razor视图和RazorEngine。

从字符串中的属性创建对象

没有内置任何内容来执行此操作,但是您可以使用字符串(字符串。Split将允许您在","上拆分,但是如果您的文本中可能有这些内容,则必须构建一个真正的解析器,或者将字符串格式切换为CSV之类的格式,您可以在其中找到很多解析器。 您也许能够找到用于简单语法的属性分析器。 或者,将其他属性字符串推送为 json,并使用 Json.net 进行解析。

将字符串解析为键/值结构后,可以使用 ExpandoObject 填充最终对象并返回该对象。
https://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject(v=vs.110).aspx

这是一个真正的基于 json 的解决方案的天真实现。
您可以使用以下命令调用它:

dynamic d = Model.GetColModel("customer", 17, " { formatoptions : { formatter : '"number'", editable :true }, stam :2}");

实现:

static class ModelExtension
{   
    public static dynamic GetColModel(this Model model, string colName, int colWidth, string additonalProperties) {
        dynamic expando = new ExpandoObject();
        var json = JsonConvert.DeserializeObject<JObject>(additonalProperties);
        expando.name = colName;
        expando.width = colWidth;
        return new FromPropertiesDynamicObjectCreator(expando, json);
    }
    private class FromPropertiesDynamicObjectCreator : DynamicObject
    {
        private readonly dynamic expando = null;
        public FromPropertiesDynamicObjectCreator(IDictionary<string, object> expando, JObject props = null) {
            this.expando = expando;
            if (props != null) {
                ((dynamic)this).props = props;
            }
        }
        public override bool TrySetMember(SetMemberBinder binder, object value) {
            if (binder.Name.Equals("props")) {
                var jsonObj = value as JObject;
                JToken current = jsonObj.First;
                var dictionary = expando as IDictionary<string, object>;
                RecurseJson(current, dictionary);
                return true;
            }
            return false;
        }
        private void RecurseJson(JToken current, IDictionary<string, object> dictionary) {
            JToken value;
            Dictionary<string, object> newDictionary;
            while (current != null) {
                var children = current.Children().ToList();
                foreach (var child in children) {
                    switch (child.Type) {
                        case JTokenType.Object:
                        case JTokenType.Array:
                            newDictionary = new Dictionary<string, object>();
                            dictionary[child.Path] = newDictionary;
                            RecurseJson(child, newDictionary);
                            break;
                        case JTokenType.Property:
                            var prop = ((JProperty)child);
                            value = prop.Value;
                            if (value.HasValues) {
                                newDictionary = new Dictionary<string, object>();
                                dictionary[prop.Name] = newDictionary;
                                RecurseJson(child, newDictionary);
                                break;
                            }
                            dictionary[prop.Name] = ((dynamic)value).Value;
                            break;
                        default:
                            var val = ((dynamic)child).Value;
                            if (val is JToken) {
                                dictionary[child.Path] = val.Value;
                            }
                            else {
                                dictionary[child.Path] = val;
                            }
                            break;
                    }
                }
                current = current.Next;
            }
        }
        public override bool TryGetMember(GetMemberBinder binder, out object result) {
            object value;
            var dictionary = expando as IDictionary<string, object>;
            if (dictionary.TryGetValue(binder.Name, out value)) {
                var innerDictionary = value as IDictionary<string, object>;
                if (innerDictionary != null) {
                    result = new FromPropertiesDynamicObjectCreator(innerDictionary);
                }
                else {
                    result = value;
                }
                return true;
            }
            result = null;
            return true;
        }
    }
}