应用于方法的属性是否可以检查该方法的返回值?

时间:2016-03-16 18:54:17

标签: c# attributes

在C#中,我有一个检索并返回值的方法。它基本上打电话给别人的方法。

public Thing GetFoo()
{
    return GetThingFromSource("foo");  // This is someone else's method...
}

我有很多这些方法。可以在整个地方调用GetFoo,并将其集中以避免分散引用字符串" foo"这可能会在未来某个时候发生变化。

我为很多不同的方法做这个模型。在每种情况下,返回的东西都不能为空。

所以我需要这样做:

public Thing GetFoo()
{
    var thing = GetThingFromSource("foo");
    Assert.IsNotNull(thing, "Thing was null");
    return thing;
}

这似乎是重复的。我很想看到这样的事情:

[EnsureReturnValueNotNull("OMG, thing was null!!!!")]
public Thing GetFoo()
{
    return GetThingFromSource("foo");
}

这样的事情存在吗?我怎么写这样的东西?我正在思考Python的方法装饰器 - 这是"包装"方法。或者甚至是奇怪的事件类型的东西,它在方法运行后抛出并检查返回值。

我可能会到达这里,但它似乎很方便。

1 个答案:

答案 0 :(得分:1)

in' plain' c#没有这样的事情。属性实际上什么都不做。如果你在某种框架(MVC路由,单元测试等)中使用GetFoo,你可以使它工作,在这种情况下,你可以检查属性并应用它们的含义。

使其工作的一种方法是使用Postsharp(https://www.postsharp.net/)然后它看起来像这样

[Serializable]
public class EnsureReturnValueNotNullAttribute : MethodInterceptionAspect
{

    public override void OnInvoke(MethodInterceptionArgs args)
    {
        base.OnInvoke(args);

        if (args.ReturnValue == null)
        {
            Console.WriteLine(
                "OMG, thing was null!!!!");

        }
    }
}

您在这里寻找的术语是面向方面编程。还有一些其他的框架,但我发现没有任何东西可以击败postharp。