Как получить тип возвращаемого значения и тип generi c типа возвращаемого значения текущего метода, выполняемого в c#? - PullRequest
0 голосов
/ 31 марта 2020

У меня есть этот код

    [HttpPost("search")]
    public async Task<ActionResult<int>> GetEmployees([FromBody] EmployeeSearchDto employeeSearchParameters)
    {

    }

Как получить

Тип ActionResult и

тип int

Не могу найти возвращаемое свойство типа в отражениях.

Дополнительная информация:

Проблема, которую я пытаюсь решить

Я использую медиатор, в котором определяется ответ во время выполнения.

У меня есть этот метод

    public Task<ActionResult<ListDto<EmployeeListItemDto>>> GetEmployees([FromBody] EmployeeSearchDto employeeSearchParameters)
    {
        var request = new GetEmployeesQuery()
        {
            EmployeeSearchParameters = employeeSearchParameters
        };

        var response = await _mediator.Send(request).ConfigureAwait(false); //this  returns a response is determined in runtime due to mediatr that contains a property Ienumerable<T> T as employee


        return base.ProcessResponse(response); //this returns and ObjectResult with values from the database
    }

Проблема в том, что когда мы заменили тип возврата

Task<ActionResult<ListDto<EmployeeListItemDto>>>

на

Task<ActionResult<int>> 

он все еще работает, и Swagger показывает 0 как успешный ответ из-за типа возвращаемого значения int.

Меня спросили, можем ли мы предотвратить это,

Я подумал, сравнивая возвращаемый тип ответа .ResponseValues, который возвращает IEnumerable

и ActionResult, если они равны во время выполнения.

В основном то, что мы пытаемся выполнить sh, это безопасность типов, которую я не знаю, возможно, поэтому я прибег к отражение.

Обновление Я пытался использовать решение РБ , но не уверен, как его использовать.

public Task<ActionResult<ListDto<EmployeeListItemDto>>> GetEmployees([FromBody] EmployeeSearchDto employeeSearchParameters)
{
    var request = new GetEmployeesQuery()
    {
        EmployeeSearchParameters = employeeSearchParameters
    };

    var response = await _mediator.Send(request).ConfigureAwait(false); //this  returns a response is determined in runtime due to mediatr that contains a property Ienumerable<T> T as employee
GetMethodInfo(GetEmployees); //Im getting cannot be inferred from the usage error.


    return base.ProcessResponse(response); //this returns and ObjectResult with values from the database
}

    public Type GetMethodInfo<T>(Func<T> foo)
    {
        return foo.GetType().GetGenericArguments().Single();
    }

Я получаю, не может быть выведен из ошибки использования

1 Ответ

0 голосов
/ 31 марта 2020

Чтобы найти тип возвращаемого значения метода, выполняемого в данный момент, вам необходимо привести MethodBase.GetCurrentMethod() к MethodInfo.

var method = MethodBase.GetCurrentMethod();

var returnType = ((MethodInfo)method).ReturnType;

// You can now inspect the return type as a normal Type.

EDIT - Asyn c support

Приведенный выше код не работает для метода async. Однако вы можете использовать другой метод для получения правильного значения:

public async Task<int> Bob()
{
    var returnType = Utilities.GetMethodInfo(Bob);
    // returnType == typeof(Task<Int32>) 

    return 5;
}

public static class Utilities
{
    public static Type GetMethodInfo<T>(Func<T> foo)
    {
        return foo.GetType().GetGenericArguments().Single();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...