C# 实例化ActionDescriptor

C# 实例化ActionDescriptor,c#,asp.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 4,我想设计一个模型,以某种方式指定用于搜索的控制器操作。我不想将操作的url指定为字符串,因为如果该操作不存在,我不希望应用程序编译 据我所知,似乎我应该指定类型为System.Web.Mvc.ActionDescriptor的属性,如下所示: public class myModel { public string id { get; set; } ... public ActionDescriptor search_action { get; set; } } 从中,

我想设计一个模型,以某种方式指定用于搜索的控制器操作。我不想将操作的url指定为字符串,因为如果该操作不存在,我不希望应用程序编译

据我所知,似乎我应该指定类型为
System.Web.Mvc.ActionDescriptor
的属性,如下所示:

public class myModel {
    public string id { get; set; }
    ...
    public ActionDescriptor search_action { get; set; }
}
从中,我了解了如何迭代所有控制器上的所有操作,但在实例化
ActionDescriptor
以设置属性时遇到了问题

我希望能够做一些变化:

myModel m = new myModel();
m.search_action = 
    (ActionDescriptor)new myNamespace.Controllers.myController().myAction;
但是什么也没有得到

我错过什么了吗?如何将控制器操作指定为模型的属性?这可能吗?

您可以在模型中声明一个委托属性,该属性包含相应的操作特定类型参数,您将使用
操作设置该参数

public class myModel {
    public string id { get; set; }
    //Specify your specific Action's type arguments here
    public Func<,> search_action { get; set; }
}
公共类myModel{
公共字符串id{get;set;}
//在此处指定特定操作的类型参数
公共函数搜索_操作{get;set;}
}
首先,我不得不问,为什么需要将动作本身存储为模型的一部分。这似乎是错误的做法;但我同样缺乏背景和理由来解释你为什么要这么做

如果只希望操作存在的编译安全性,那么最好根据控制器的类型创建一个表达式方法,并从中提取
字符串
操作名称(如)

另一方面,如果您确实希望能够使用(只存储有关操作的信息)或
Func
(只存储IL,而不存储名称、上下文或控制器)从模型执行此操作(即使在理解了这是多么糟糕的想法之后),这只会让您半途而废

所以我再次问,你到底为什么要这么做