嗯,是的,你可以,用自己的委託聲明:
delegate SelfReturner<T> SelfReturner<T>(T value, string name);
static SelfReturner<T> NotNull<T>(T value, string name)
{
if (value == null) throw new ArgumentNullException(name);
return NotNull;
}
...但它似乎並沒有對我有用。你真的想要這麼做的原因,而不是僅僅做三個獨立的電話?例如,我有一個Preconditions.CheckNotNull
,它返回非空值 - 我發現比這看起來更有用,說實話。
正如評論中指出的那樣,只有在所有參數都是相同類型(或者全部隱式轉換爲第一個參數類型)的情況下,上述內容纔有效。另一種允許使用位更多的工作鏈是使用單一實例與通用方法:
public sealed class NullChecker
{
public static NullChecker Instance { get; } = new NullChecker();
private NullChecker() {}
public static NullChecker Scrub<T>(T value, string paramName) where T : class
{
if (value == null)
{
throw new ArgumentNullException(paramName);
}
return this;
}
}
用途爲:
NullChecker.Instance.Scrub(param1, nameof(param1))
.Scrub(param2, nameof(param2))
.Scrub(param3, nameof(param3));
用兩種不同的方法,一個靜態和一個不是(但名稱不同),您可以刪除Instance
部分。例如:
NullChecker.Scrub(param1, nameof(param1))
.And(param2, nameof(param2))
.And(param3, nameof(param3));
但是,如果'param1'是一個字符串,這隻會工作如果'param2','param3',...也是字符串,對不對? –
我真的只是好奇,如果它實際上可能比什麼都重要。 – adam0101
@IanMercer:啊,是的,你是對的。我不確定解決這個問題很容易 - 只需要一個單例方法可能會更好。將編輯以表明這一點。 –