gpt4 book ai didi

.net - 是否可以重构这个扩展方法?

转载 作者:行者123 更新时间:2023-12-03 07:29:42 24 4
gpt4 key购买 nike

我有以下扩展方法:

public static void ThrowIfArgumentIsNull<T>(this T value, string argument) 
where T : class
{
if (value == null)
{
throw new ArgumentNullException(argument);
}
}

这是其用法的一个示例......

// Note: I've poorly named the argument, on purpose, for this question.
public void Save(Category qwerty)
{
qwerty.ThrowIfArgumentIsNull("qwerty");
....
}

100% 正常工作。

但是,我不喜欢必须提供变量名称,只是为了帮助我的异常消息。

我想知道是否可以重构扩展方法,这样就可以这样调用......

qwerty.ThrowIfArgumentIsNull();

它会自动找出变量的名称是“qwerty”,因此将其用作 ArgumentNullException 的值。

可能吗?我假设反射可以做到这一点?

最佳答案

不,你不能这样做。这固然很好,但如果没有某种 AOP 的参与,这是不可能的。我确信 PostSharp 可以做得很好,希望使用属性,并且在代码契约中它只是:

Contract.Requires(qwerty != null);

理想情况下,我想要一个生成代码契约调用的 PostSharp 属性 - 我会在某个时候使用它 - 但在那之前,您所拥有的扩展方法是我发现的最佳方法。 ..

(如果我尝试过 PostSharp + 代码契约方法,我肯定会在博客上介绍它,顺便说一句... Mono Cecil 也可能使它变得相当简单。)

编辑:为了扩展洛朗的答案,您可能有:

new { qwerty }.CheckNotNull();

如果您有很多不可为空的参数,您可以:

new { qwerty, uiop, asdfg }.CheckNotNull();

这必须使用反射来计算属性。有一些方法可以避免在每次访问时进行反射,为每个属性构建一个委托(delegate),并通常使其变得清晰。我可能会在博客文章中对此进行调查...但这有点令人讨厌,而且我更喜欢能够仅归因于参数的想法...

编辑:代码已实现,并且 blog post正式制作。恶心,但很有趣。

关于.net - 是否可以重构这个扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1873264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com