음 그래, 당신은 은 자신의 대리자 선언 할 수 있습니다
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;
}
...하지만 나에게 유용하지 않는 것 같습니다. 세 가지 별도의 전화를하기보다는 실제로이 작업을 수행하려는 이유는 무엇입니까? 예를 들어, null이 아닌 값을 반환하는 Preconditions.CheckNotNull
이 있습니다. 솔직히 말하면이 모양보다 훨씬 유용하다는 것을 알았습니다.
주석에서 언급했듯이 모든 매개 변수가 동일한 유형 (또는 모든 매개 변수가 첫 번째 매개 변수의 유형으로 암시 적으로 변환 가능) 인 경우에만 위의 기능이 작동합니다. 두 개의 별도의 방법, 하나는 정적 및 하나
NullChecker.Instance.Scrub(param1, nameof(param1))
.Scrub(param2, nameof(param2))
.Scrub(param3, nameof(param3));
:
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;
}
}
사용 등 : 대안은 일반적인 방법으로 싱글 인스턴스를 사용하는 것 비트 더 많은 작업과 체인 있도록 그렇지 않으면 (다른 이름으로) Instance
부분을 제거 할 수 있습니다. 예를 들어 :
public static class Scrub
{
public static T NotNull<T, U>(this T value, U property, string name)
{
if (property == null) throw new ArgumentNullException(name);
return value;
}
}
당신은 할 수 있습니다 :
test.NotNull(test.A, nameof(testA.A).NotNull(test.B, nameof(testA.B)));
당신이 원하는 그렇진 무엇
NullChecker.Scrub(param1, nameof(param1))
.And(param2, nameof(param2))
.And(param3, nameof(param3));
그러나'param1'이 문자열이라면'param2','param3', ... 역시 문자열 일뿐입니다. –
실제로 무엇보다 더 많은 것이 가능했다면 나는 정말로 호기심이 많았다. – adam0101
@IanMercer : 아 맞습니다. 당신 말이 맞습니다. 나는 그것을 고치는 것이 쉽지 않다. 싱글 톤 방법을 사용하는 것이 더 나을 것이다. 그것을 나타 내기 위해 편집 할 것입니다. –