Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从反射的方法动态创建JSON对象_C#_Json_Rest_Model View Controller - Fatal编程技术网

C# 从反射的方法动态创建JSON对象

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

此后,我从获得了大量帮助,因此hivemind能够创建一个REST API(C#,MVC),通过捕获字符串参数和使用反射找到正确的方法来处理动态(至少我想这样称呼它)调用

 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());