从字符串中的属性创建对象
本文关键字:属性 创建对象 字符串 | 更新日期: 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;
}
}
}