如何将控制器(控制器名称)作为参数传递给另一种方法?

时间:2019-02-19 07:56:03

标签: c# model-view-controller .net-core

所以我想知道是否可以将Controller作为参数发送给另一种方法。我要完成的工作是通过采用两个参数(控制器名称和方法名称)来创建一种类似于文件路径构建器的方法。

我在Controller中有一个方法,如下所示:

  public async Task GetActiveCountyRegulationByIdSuccess()
    {

        FilePathBuilder builder = new FilePathBuilder();
        builder.FilePath(CountyControllerTest,GetActiveCountyRegulationByIdSuccess);
        ...

因此,我的控制器的名称为CountyControllerTest,而我的方法的名称为GetActiveCountyRegulationByIdSuccess。我想将这两个参数发送到:

 public class FilePathBuilder
   {

    public string FilePath(object controller, object method)
       {
        var filePath = "testfiles/" + nameof(controller) + nameof(method) + "Actual.xml";

        return filePath;
       }
   }

并将FilePath方法中内置的字符串beeing返回给我的控制器。问题是,当我尝试将其作为参数传递时,控制器出现错误。错误消息说“ CountyController”是一种类型,在给定的上下文中无效。

任何答案都值得赞赏。

4 个答案:

答案 0 :(得分:0)

您正在寻找两个属性:

  var action = ControllerContext.ActionDescriptor.ActionName;
  var controller = ControllerContext.ActionDescriptor.ControllerName;

答案 1 :(得分:0)

我设法通过以下方式简单地传递了控制器和方法:

FilePathBuilder builder = new FilePathBuilder();
builder.FilePath(nameof(CountyControllerTest), nameof(GetActiveCountyRegulationByIdSuccess));

在我的FilePath方法中:

public class FilePathBuilder
{

    public string FilePath(object controller, object method)
    {
        var filePath = "TestFiles/" + controller + "/" + method + "Actual.xml";

        return filePath;
    }
}

答案 2 :(得分:0)

您可以使用System.Reflection做到这一点:

// Current class name
this.GetType().Name
// Current method name 
MethodBase method = MethodBase.GetCurrentMethod();

请注意,Reflection的使用是相对较慢/昂贵的操作,也许最好坚持使用字符串常量。

答案 3 :(得分:0)

由于未传递类实例,因此收到此错误。您可以做的就是更改您的方法,使其接受一个类型,然后从那里可以使用类名。像这样:

  public async Task GetActiveCountyRegulationByIdSuccess()
    {

        FilePathBuilder builder = new FilePathBuilder();
        builder.FilePath(typeof(CountyControllerTest), typeof(GetActiveCountyRegulationByIdSuccess));
        ...

然后builder方法接受两个类型参数并使用它们的名称:

public class FilePathBuilder
   {

    public string FilePath(Type controllerType, Type methodType)
       {
        var filePath = "testfiles/" + controllerType.Name  + methodType.Name + "Actual.xml";

        return filePath;
       }
   }