Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.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# 在c中创建另一个Api的Web Api#_C#_Asp.net Mvc_Asp.net Web Api2 - Fatal编程技术网

C# 在c中创建另一个Api的Web Api#

C# 在c中创建另一个Api的Web Api#,c#,asp.net-mvc,asp.net-web-api2,C#,Asp.net Mvc,Asp.net Web Api2,我的要求是在c#中创建一个web api,它将根据文档创建另一个api。 用户将发送新api需要执行的api名称、操作方法名称、请求和操作类型,我们的api将创建所需的api并返回包含api url和请求/响应类型的响应 我在很多不同的网站上搜索过,但没有找到任何与之相关的东西。如果有人对此有解决方案或任何相近的想法,请分享。我需要在asp.net MVC中执行此操作,我有一个示例程序,它使用CodeDomCompiler为任何给定接口生成标准遥测实现。代码被编译到内存并加载到地址空间。这听起来

我的要求是在c#中创建一个web api,它将根据文档创建另一个api。 用户将发送新api需要执行的api名称、操作方法名称、请求和操作类型,我们的api将创建所需的api并返回包含api url和请求/响应类型的响应


我在很多不同的网站上搜索过,但没有找到任何与之相关的东西。如果有人对此有解决方案或任何相近的想法,请分享。我需要在asp.net MVC中执行此操作,我有一个示例程序,它使用CodeDomCompiler为任何给定接口生成标准遥测实现。代码被编译到内存并加载到地址空间。这听起来像是你要做的。如果是这样,尝试使用示例生成一些代码,并在遇到问题时提问

这可能会帮助你开始

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text;
using TelemeterFactory;

namespace ConsoleTelemeter
{
    /// <summary>Generate a CSharp Telemeter that calls Console.WriteLine as its output.</summary>
    public class Factory : FactoryBase
    {
        public override string[] GenerateSource(SourceGenerationOptions options)
        {
            var generatedClassName = options.Type.Name + "_" + options.FactoryOptions.ClassName;

            var text = this.CSharpTemplate()
                .Replace("<codeGenerationTool>", $"{nameof(ConsoleTelemeter)} {Assembly.GetExecutingAssembly().GetName().Version} {DateTimeOffset.UtcNow:yyyy-MM-dd HH:mm:ss zzz}")
                .Replace("<generatedNamespace>", options.FactoryOptions.Namespace)
                .Replace("<generatedClassName>", generatedClassName)
                .Replace("<interfaceImplemented>", options.Type.FullName)
                .Replace("//<privateFields>", "private const string Null = \"<null>\";")
                .Replace("//<publicMethodImplementations>", Methods(options.Methods))
                .Replace("\t", "    ")
                ;

            return new[] { text, $"{options.FactoryOptions.Namespace}.{generatedClassName}" };
        }

        private string Methods(IReadOnlyList<MethodInfo> methods)
        {
            var sb = new StringBuilder(4096);
            foreach (var method in methods)
            {
                // method start
                sb.AppendFormat("\n\t\tpublic {0} {1} (", method.ReturnType, method.Name);
                var comma = string.Empty;
                foreach (ParameterInfo parameter in method.GetParameters())
                {
                    sb.AppendFormat("{0}{1} {2}", comma, parameter.ParameterType, parameter.Name);
                    comma = ", ";
                }
                sb.Append(") {\n");

                sb.Append("\t\t\tvar result = $\"{DateTimeOffset.UtcNow:yyyy-MM-dd HH:mm:ss.ffffff} ");
                sb.Append("{nameof(");
                sb.Append(method.Name);
                sb.Append(")}: ");

                comma = string.Empty;
                foreach (ParameterInfo parameter in method.GetParameters())
                {
                    var t = parameter.ParameterType;
                    sb.AppendFormat("{0}{{nameof({1})}}={{", comma, parameter.Name);

                    // special case for boolean parameters to be coerced to strings below.  Not strictly necessary for this Telemeter but show how one could do it if necessary.
                    sb.AppendFormat("{1}{0}", parameter.Name, t == typeof(Boolean) ? "(" : string.Empty);

                    if (t == typeof(string))
                    {
                        sb.Append(" ?? Null");
                    }
                    else if (t == typeof(Int32) 
                         || t == typeof(float) 
                         || t == typeof(double)
                         || t == typeof(Int64)
                         || t == typeof(decimal)
                         || t == typeof(Int16))
                    {
                        sb.Append(":#0");
                    }
                    else if (t.BaseType == typeof(Enum))
                    {
                        sb.Append(":D");
                    }
                    else if (t == typeof(Boolean))
                    {
                        sb.Append("? \"1\" : \"0\")");
                    }
                    else
                    {
                        sb.Append(".ToString() ?? Null");
                    }

                    sb.Append("}");
                    comma = ",";
                }

                sb.Append("\";\n\t\t\treturn result;\n");

                // method end
                sb.Append("\t\t}\n");
            }

            return sb.ToString();
        }
    }
}
使用系统;
使用System.Collections.Generic;
运用系统反思;
使用系统文本;
使用遥测工厂;
名称空间控制台计数器
{
///生成调用Console.WriteLine作为其输出的CSharp遥测仪。
公共类工厂:FactoryBase
{
公共重写字符串[]GenerateSource(SourceGenerationOptions选项)
{
var generatedClassName=options.Type.Name+“”+options.FactoryOptions.ClassName;
var text=this.CSharpTemplate()
.Replace(“,$”{nameof(ConsoleTelemeter)}{Assembly.getExecutionGassembly().GetName().Version}{DateTimeOffset.UtcNow:yyyy-MM-dd-HH:MM:ss-zzz}”)
.Replace(“,options.FactoryOptions.Namespace)
.Replace(“,generatedClassName)
.Replace(“,options.Type.FullName)
.Replace(“/”,“private const string Null=\“\”;”)
.Replace(“/”,方法(options.Methods))
.替换(“\t”,”)
;
返回新的[]{text,$“{options.FactoryOptions.Namespace}.{generatedClassName}”;
}
私有字符串方法(IReadOnlyList方法)
{
var sb=新的StringBuilder(4096);
foreach(方法中的var方法)
{
//方法开始
sb.AppendFormat(“\n\t\tpublic{0}{1}”(,method.ReturnType,method.Name);
var逗号=string.Empty;
foreach(方法.GetParameters()中的ParameterInfo参数)
{
sb.AppendFormat(“{0}{1}{2}”,逗号,parameter.ParameterType,parameter.Name);
逗号=“,”;
}
某人附加(“){\n”);
sb.Append(“\t\t\tvar result=$\”{DateTimeOffset.UtcNow:yyyy-MM-dd-HH:MM:ss.ffffffff}”);
某人附加(“{nameof(”);
sb.Append(方法名称);
某人加上(“)}:”;
逗号=string.Empty;
foreach(方法.GetParameters()中的ParameterInfo参数)
{
var t=parameter.ParameterType;
sb.AppendFormat(“{0}{{nameof({1}}}}}={{”,逗号,parameter.Name);
//将布尔参数强制为以下字符串的特殊情况。对于此遥测仪来说,这不是严格必需的,但说明了如何在必要时执行此操作。
sb.AppendFormat(“{1}{0}”,parameter.Name,t==typeof(Boolean)?”(“:string.Empty);
if(t==typeof(string))
{
sb.追加(“?空”);
}
else if(t==typeof(Int32)
||t==类型(浮动)
||t==typeof(双精度)
||t==typeof(Int64)
||t==类型(十进制)
||t==typeof(Int16))
{
某人附加(“:#0”);
}
else if(t.BaseType==typeof(Enum))
{
某人加上(“:D”);
}
else if(t==typeof(Boolean))
{
某人追加(“?\”1\:\”0\”);
}
其他的
{
sb.追加(“.ToString()?”空”);
}
某人附加(“}”);
逗号=“,”;
}
sb.追加(“\”;\n\t\t\t返回结果;\n”);
//方法端
sb.追加(“\t\t}\n”);
}
使某人返回字符串();
}
}
}

这是一个非常广泛的问题,一般来说,您试图设计的体系结构将过于复杂、高度不安全,并且几乎无法维护。此设计决策的目的是什么?谁是此系统的预期用户,他们都对代码有足够的了解,知道您的数据结构是什么样的eed自定义API,但同时无法将其所需的API直接添加到服务器代码中?一般来说,我必须每天制作大量API(每天3-4个API)对于我的项目,基本上是为了crud操作等。所以为了节省制作这些api的时间,我决定制作一个能够创建api的api。我知道这不是我能在1-2天内完成的事情。但我认为创建这种应用程序是可能的。感谢您的关注。这并不是解决此类问题的正确方法嗯,不过。如果你想通过重复或不断重复使用样板代码来节省自己的工作量,你可能想看看设计用来处理这类事情的工具,比如PostSharp。是的,我认为你是对的,在制作这个应用程序上浪费时间对我来说是不值得的。我想我还不足以做到这一点他一个人申请。PostSharp是个不错的选择,我想我应该去。谢谢你的建议。你会怎么做