繁体   English   中英

在没有委托的情况下将方法用作C#中的参数?

[英]Using methods as parameters in C# without delegates?

我正在查看一些知识渊博的同事编写的代码,并且遇到了一种令我感到困惑的技术。 这是一段代码...

public class TaxController : ApiController
{
    private StateTaxApi taxApi = new taxApi();

    [HttpGet]
    public async Task<IEnumerable<String>> GetStatesOwedTax(String taxId, String clientId)
    {
        try
        {
            return await taxApi.GetStatesOwedTax(clientId, GetTaxId(), GetClientId());
        }
        catch (Exception e)
        {
            throw new ApiException(HttpStatusCode.BadRequest, "Could not get tax states", e);
        }           
    }

    private String GetClientId()
    {
        try
        {
            return Request.Headers.GetValues("client-id").FirstOrDefault();
        }
        catch (InvalidOperationException e)
        {
            // TODO: Handle error here
        }

        return null;
    }

    private String GetTaxId()
    {
        return GetSessionValue("taxId") as String;
    }

    private Object GetSessionValue(String key)
    {
        var context = Request.Properties["MS_HttpContext"] as HttpContextWrapper;
        var session = context.Session;
        return session[key];
    }
}

在这里,您可以看到方法作为参数传递给方法GetStatesOwedTax()

return await taxApi.GetStatesOwedTax(clientId, GetTaxId(), GetClientId());

我认为唯一的方法就是使用委托来表示要作为参数传递的方法。 我没有提到定义代表的Func(string) 我想念什么?

该方法未通过,该方法的结果正在通过。 这么简单,我发现一个例子总是更好。

public void Start()
{
    var result = DoMath(GetX(), GetY());
}

public int GetX()
{
    return 1;
}

public int GetY()
{
    return 2;
}

public int DoMath(int x, int y)
{
    return x + y;
}

在示例中可以看到, DoMath()需要将两个int传递给它。 替代

public void Start()
{
    var x = GetX();
    var y = GetY();
    var result = DoMath(x, y);
}

您可以直接在DoMath()方法的参数中进行方法调用。

现在,这是否更简单,更好,更好/不好的做法都取决于个人风格和整体复杂性。 如果它可读性强,那么您可以通过这样做节省空间,但是这样做确实有使泥泞的水面变得模糊不清的风险。 因此,我不能说您是否应该这样做,只是说您可以做到。

正如Vilx在评论中所提到的那样,一种简单的方法来判断该方法是否通过,而方法的结果则是包含括号。 如果它们在那里(如本例所示),则意味着将对该方法进行评估并使用其结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM