C# 从反射的方法动态创建JSON对象
此后,我从获得了大量帮助,因此hivemind能够创建一个REST API(C#,MVC),通过捕获字符串参数和使用反射找到正确的方法来处理动态(至少我想这样称呼它)调用C# 从反射的方法动态创建JSON对象,c#,json,rest,model-view-controller,C#,Json,Rest,Model View Controller,此后,我从获得了大量帮助,因此hivemind能够创建一个REST API(C#,MVC),通过捕获字符串参数和使用反射找到正确的方法来处理动态(至少我想这样称呼它)调用 var myType = typeof(JaberoDC.JaberoDC.JaberoDC); var method = myType .GetMethods(BindingFlags.Public | BindingFlags.Instance | Bindin
var myType = typeof(JaberoDC.JaberoDC.JaberoDC);
var method = myType
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Single(mi =>mi.ReturnType == typeof(DataSet)
&& string.Equals(mi.Name, param, StringComparison.OrdinalIgnoreCase));
var subject = Activator.CreateInstance(myType);
var result = method.Invoke(subject, new Object[] { "", conStr, "", 0, 0, null });
DataSet ds = (DataSet)result;
我现在需要的帮助是关于如何动态处理各种结果的任何建议。这意味着我需要一些帮助来理解如何创建一个类来处理DataTable中的行中的0=>N列(在从DS获取DT之后),或者如何序列化数据而不创建上述类的实例
再说一次,如果我的术语不在这里,我很抱歉
基本上,我在目前的雇主那里已经陷入了为一个有几百个方法的DataComponent创建RESTAPI的深渊。目前,API仅在使用以下代码时有效:
List<Worksite> arr2 = new List<Worksite>();
foreach (DataTable table in ds.Tables)
{
foreach (DataRow row in table.Rows)
{
string id = row["JobID"].ToString();
string name = row["JobName"].ToString();
string site = row["SiteName"].ToString();
arr2.Add(new Worksite
{
ID = id,
JobName = name,
SiteName = site
});
}
}
List arr2=新列表();
foreach(ds.Tables中的数据表)
{
foreach(table.Rows中的DataRow行)
{
字符串id=行[“作业id”]。ToString();
字符串名称=行[“作业名称”]。ToString();
字符串site=行[“SiteName”]。ToString();
arr2.添加(新工地)
{
ID=ID,
JobName=名称,
SiteName=site
});
}
}
基本上,这只处理工作站点(DataComponent中的特定数据集)
我当前的解决方案:
public string GetFromParam(String param)
{
var myType = typeof(JaberoDC.JaberoDC.JaberoDC);
var method = myType
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Single(mi =>mi.ReturnType == typeof(DataSet)
&& string.Equals(mi.Name, param, StringComparison.OrdinalIgnoreCase));
var subject = Activator.CreateInstance(myType);
var result = method.Invoke(subject, new Object[] { "", conStr, "", 0, 0, null });
DataSet ds = (DataSet)result;
List<GenerateModel> arr2 = new List<GenerateModel>();
int count = 0;
List<Dictionary<string, object>> rows = new List<Dictionary<string, object>>();
Dictionary <string, object> dicRow;
foreach (DataTable table in ds.Tables)
{
foreach (DataRow row in table.Rows)
{
dicRow = new Dictionary<string, object>();
foreach (DataColumn col in table.Columns){
dicRow.Add(col.ColumnName, row[col]);
}
rows.Add(dicRow);
}
}
// for (int i = 0; i < ds.Tables.)
string json = JsonConvert.SerializeObject(rows);
return json;
}
公共字符串GetFromParam(字符串参数)
{
var myType=typeof(JaberoDC.JaberoDC.JaberoDC);
var方法=myType
.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly)
.Single(mi=>mi.ReturnType==typeof(数据集)
&&等于(mi.Name,param,StringComparison.OrdinalIgnoreCase));
var subject=Activator.CreateInstance(myType);
var result=method.Invoke(subject,新对象[]{“”,conStr,“,0,0,null});
数据集ds=(数据集)结果;
List arr2=新列表();
整数计数=0;
列表行=新列表();
字典迪克罗;
foreach(ds.Tables中的数据表)
{
foreach(table.Rows中的DataRow行)
{
dicRow=新字典();
foreach(table.Columns中的数据列col){
添加(列名称,行[col]);
}
行。添加(dicRow);
}
}
//对于(int i=0;i
我基本上是在使用标记答案中提出的解决方案,同时也使用动态解决方案来解决数据键-值对问题,方法是使用字典来保存它们 我同意Clint关于Newtonsoft使用Json.net的评论。有很多帮助方法可以让你的生活更轻松 理想情况下,您将为预期接收的每种数据类型创建一个控制器。然后,您可以使用传入的数据创建一个类的实例,该类按照您将要接收的数据建模。使用RESTful API和MVC,我将传入的数据视为FormDataCollection,这类似于必须按顺序处理的传入键值对流。下面是一个代码示例,为您指明正确的方向:
// POST api/mycontrollername
public HttpResponseMessage Post(FormDataCollection fdc)
{
try
{
if (fdc != null)
{
MyClass myInstance = new MyClass();
IEnumerator<KeyValuePair<string, string>> pairs = fdc.GetEnumerator();
while (pairs.MoveNext())
{
switch (pairs.Current.Key)
{
case "PhoneNumber":
myInstance.PhoneNumber = pairs.Current.Value;
break;
...
default:
// handle any additional columns
break;
}
}
// do stuff with myInstance
// respond with OK notification
}
else
{
// respond with bad request notification
}
}
catch (Exception ex)
{
// respond with internal server error notification
}
}
//发布api/mycontrollername
公共HTTPResponseMessagePost(FormDataCollection fdc)
{
尝试
{
如果(fdc!=null)
{
MyClass myInstance=新的MyClass();
IEnumerator pairs=fdc.GetEnumerator();
while(pairs.MoveNext())
{
开关(成对、电流、钥匙)
{
案例“电话号码”:
myInstance.PhoneNumber=pairs.Current.Value;
打破
...
违约:
//处理任何附加列
打破
}
}
//用myInstance做一些事情
//回复OK通知
}
其他的
{
//以错误请求通知进行响应
}
}
捕获(例外情况除外)
{
//响应内部服务器错误通知
}
}
如果必须使用同一控制器处理多个数据类型,则可能存在一个特定的数据字段,该字段将为您提供接收内容的线索,以便您可以适当地处理它。如果你真的不知道你在任何时候都收到了什么,你可以将它转换为动态类型并使用反射,但在这种情况下,听起来好像数据发送者正在为你设置一个艰难的集成-这绝对不是我设计API的方式
编辑:(根据您的评论进行澄清)似乎您希望使用单个控制器接受任何数量的数据类型请求,并返回带有结果的数据表,即使您事先不知道数据表将包含哪些字段
首先,除非是一个特定的需求,否则我不会使用DataTable,因为它不是一个非常独立于平台的解决方案——如果请求应用程序使用的是非.NET语言,那么与DataTable相比,解析Json数组会更容易。如果必须使用DataTable,可以查看.Net的DataTable.ToXML()扩展方法,但我遇到了一些特殊字符不能很好地转换为XML的问题,以及这种方法的一些其他问题
如果您想使用推荐的json路由,那么您需要的数据
//using Newtonsoft.Json;
List<MyObject> objects = new List<MyObject>();
for (int i = 0; i < dt.Rows.Count; i++)
{
MyObject obj = new MyObject()
obj.Time = dt.Rows[i]["Time"];
obj.Person = dt.Rows[i]["PersonID"];
...
objects.Add(obj);
}
string json = JsonConvert.SerializeObject(objects.ToArray());