在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的方法装饰器 - 这是"包装"方法。或者甚至是奇怪的事件类型的东西,它在方法运行后抛出并检查返回值。
我可能会到达这里,但它似乎很方便。
答案 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。