C# 使用类似ASP.NET MVC路由的路由解析到对象

C# 使用类似ASP.NET MVC路由的路由解析到对象,c#,asp.net-mvc,asp.net-core,.net-core,asp.net-mvc-routing,C#,Asp.net Mvc,Asp.net Core,.net Core,Asp.net Mvc Routing,在ASP.NET MVC中,可以定义如下路由: routes.MapRoute("myroute", "myroute/{country}/{name}-{type}", new { controller = "MyController", action = "Get" }); var obj = BindValues<MyViewModel>(values); 这将直接解析为一个对象: public class MyController : Controller

在ASP.NET MVC中,可以定义如下路由:

routes.MapRoute("myroute",
    "myroute/{country}/{name}-{type}",
    new { controller = "MyController", action = "Get" });
var obj = BindValues<MyViewModel>(values);
这将直接解析为一个对象:

public class MyController : Controller
{
   public HttpResponseMessage Get([FromRoute] MyViewModel model)
   {
      //TODO do stuff with model.
   }
}
这是我的视图模型:

public class MyViewModel
{
    public string Name { get; set; }
    public string Type{ get; set; }
}
我的问题是,我可以在一个简单的控制台应用程序中进行同样的解析吗

class Program
{
    static void Main(string[] args)
    {
        string route = "myroute/{country}/{name}-{type}";

        string input = "myroute/Denmark/MyName-MyType";

        //TODO Parse input to MyViewModel with route
        MyViewModel result;
    }
}

public class MyViewModel
{
    public string Name { get; set; }
    public string Type { get; set; }
}

必须有某种方法来做到这一点,因为ASP.NET MVC路由是可能的。

解析和应用路由模板实际上非常简单,使用:

国家:丹麦
类型:MyType
姓名:我的名字
然而,将其绑定到一个实体将意味着您将拥有整个堆栈,这恰好是一个“稍微”更复杂的单独旋转。因此,我建议您使用一点反射手动执行此操作:

public static T BindValues<T>(RouteValueDictionary values)
    where T : new()
{
    var obj = new T();
    foreach (var prop in typeof(T).GetProperties())
    {
        if (values.ContainsKey(prop.Name))
        {
            prop.SetValue(obj, values[prop.Name]);
        }
    }
    return obj;
}
公共静态bindt值(RouteValueDictionary值)
其中T:new()
{
var obj=新的T();
foreach(typeof(T).GetProperties()中的var prop)
{
if(值。容器(属性名称))
{
属性设置值(对象,值[属性名称]);
}
}
返回obj;
}
使用方法如下:

routes.MapRoute("myroute",
    "myroute/{country}/{name}-{type}",
    new { controller = "MyController", action = "Get" });
var obj = BindValues<MyViewModel>(values);
var obj=BindValues(值);

虽然这显然比模型绑定功能弱得多,但对于您的用例来说,它应该工作得足够好。

解析和应用路由模板实际上非常简单,使用:

国家:丹麦
类型:MyType
姓名:我的名字
然而,将其绑定到一个实体将意味着您将拥有整个堆栈,这恰好是一个“稍微”更复杂的单独旋转。因此,我建议您使用一点反射手动执行此操作:

public static T BindValues<T>(RouteValueDictionary values)
    where T : new()
{
    var obj = new T();
    foreach (var prop in typeof(T).GetProperties())
    {
        if (values.ContainsKey(prop.Name))
        {
            prop.SetValue(obj, values[prop.Name]);
        }
    }
    return obj;
}
公共静态bindt值(RouteValueDictionary值)
其中T:new()
{
var obj=新的T();
foreach(typeof(T).GetProperties()中的var prop)
{
if(值。容器(属性名称))
{
属性设置值(对象,值[属性名称]);
}
}
返回obj;
}
使用方法如下:

routes.MapRoute("myroute",
    "myroute/{country}/{name}-{type}",
    new { controller = "MyController", action = "Get" });
var obj = BindValues<MyViewModel>(values);
var obj=BindValues(值);

虽然这显然比模型绑定功能弱得多,但对于您的用例来说,它应该工作得足够好。

确实有一种方法可以做到这一点,编写一些代码来解析您的值,并使用
PropertyInfo设置它们,试一试,这方面有很多东西,从regex或split开始,我不知道是否有内置的方式。我很想将路由转换为正则表达式(您可以自动执行),然后您可以根据生成的正则表达式测试“url”。如果您使用
{
}
中的名称来命名正则表达式组,您还可以轻松提取数据。不使用split,将无法更改到其他对象的路由。某些正则表达式可能会起作用,只是不确定如何使用它解析对象。对于asp.net mvc Rouning来说,如果可能的话,也必须可以用一个简单的字符串来做同样的事情。让我们看看是否有人能做出更好的解决方案,但这是一个开始:)肯定有一种方法可以做到这一点,写一些代码来解析你的值,并用
属性信息设置它们,只要试一下,上面有很多东西,从regex或split开始,我不知道是否有内置的方式。我很想将路由转换为正则表达式(您可以自动执行),然后您可以根据生成的正则表达式测试“url”。如果您使用
{
}
中的名称来命名正则表达式组,您还可以轻松提取数据。不使用split,将无法更改到其他对象的路由。某些正则表达式可能会起作用,只是不确定如何使用它解析对象。当asp.net mvc程序可以运行时,必须可以用一个简单的字符串执行同样的操作。让我们看看是否有人可以提供更好的解决方案,但这只是一个开始:)