속성을 사용하여 널 매개 변수 확인

브래드 제르맹

속성을 사용하여 기본적으로 매개 변수의 값을 확인할 수 있습니까? [FromUri]와 같은 일부 시스템 속성이 이런 방식으로 사용되는 것을 보았습니다. 나는 다음과 같은 것을 바라고 있습니다.

public void Method([NotNull] string name, [NotNull] DateTime? date)
{  }

여기서 NotNull은 값이 null인지 확인하는 속성입니다. 값이 null이면 오류가 발생합니다.

내가 현재 가지고있는 것입니다

현재 값이 null인지 여부를 확인하기 위해 식과 매개 변수 자체를 사용하는 정적 도우미 클래스를 사용하고 있으며 식을 사용하여 매개 변수의 이름을 확인합니다.

// Invoke method within ArgumentHelper class
ArgumentHelper.RequireNotNullOrEmpty(() => state, state);

// Method within static class ArgumentHelper
public static void RequireNotNullOrEmpty<T>(this Expression<Func<T>> argumentExpression, string value)
    {
        var body = ((MemberExpression)argumentExpression.Body);
        if (string.IsNullOrEmpty(value))
        {
            // Throw error "Required field '" + body.Member.Name + "' is missing.";
        }
    }

보너스 : 현재 솔루션과 마찬가지로 이름과 함께 문자열을 전달하지 않고 어떻게 든 변수의 이름을 얻을 수 있다면 좋을 것입니다.

Nishmaster

확실히 가장 성능이 좋지는 않지만 올바른 길을 가고 있습니다. 다음은 PostSharp가 IL에서 수행하는 작업을 약간 수행하는 래퍼입니다. 이것은 객체를 전달하는 데에만 유용하며 다른 메소드를 매개 변수로 전달할 때 그대로 분해됩니다. 그러나 그 문제를 해결하는 것은 약간의 작업 일뿐입니다.

프로덕션에서는이를 확장하여 나중에 사용하기 위해 캐시 할 수있는 델리게이트로 리플렉션을 빌드합니다.

public class SomeClass
{
    public void Method([NotNull] string Param1, [NotNull] string Param2)
    { }
}

public static class SomeClassExtensions
{
    public static void InvokeWithNullCheck<TObject>(this TObject obj, Expression<Action<TObject>> expression)
    {
        var body = (MethodCallExpression)expression.Body;

        foreach(var parameter in body.Method.GetParameters())
        {
            bool hasNotNullAttribute = parameter.CustomAttributes.Any(x => x.AttributeType.Equals(typeof(NotNullAttribute)));
            if(hasNotNullAttribute && ((ConstantExpression)body.Arguments[parameter.Position]).Value == null)
            {
                throw new ArgumentException(String.Format("Mandatory parameter {0} was not supplied.", parameter.Name));
            }
        }

        expression.Compile()(obj);
    }
}

[TestFixture]
public class SomeClassTests
{
    [Test]
    public void Test()
    {
        var test = new SomeClass();
        Assert.Throws<ArgumentException>(() => test.InvokeWithNullCheck(x => x.Method(null, "Test")));
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

BindAttribute의 Prefix 속성을 사용하여 단일 매개 변수에 바인딩

분류에서Dev

매개 변수 확장을 사용하여`mkdir -p`에 대한 인수 목록 생성

분류에서Dev

Python Flask를 사용하여 루프 내 URL 매개 변수의 변경 사항을 확인하는 방법

분류에서Dev

확인하는 매개 변수의 조합이 자바에 널 (null)입니다

분류에서Dev

매개 변수 확장을 사용하여 다른 확장의 출력 수정

분류에서Dev

매개 변수 확장을 사용하여 다른 확장의 출력 수정

분류에서Dev

scanf를 사용하여 입력 매개 변수 확인

분류에서Dev

매개 변수가 널인 경우 기본값 사용

분류에서Dev

정규식을 사용하여 URL에 GET 매개 변수가 있는지 확인하는 방법

분류에서Dev

클래스 속성을 사용하여 함수 매개 변수 값 제한

분류에서Dev

커널 명령 줄 매개 변수를 사용하여 sysctl을 설정하는 방법은 무엇입니까?

분류에서Dev

xamarin에서 매개 변수를 사용하여 값을 함수에 바인딩

분류에서Dev

AI Platform 하이퍼 매개 변수 조정 기능을 사용할 때 매개 변수 종속성을 강제하는 방법은 무엇인가요?

분류에서Dev

두 개의 연속 메서드 호출이 매번 다른 매개 변수를 사용하여 모의 메서드를 호출하는지 확인합니다.

분류에서Dev

매개 변수를 사용하여 WebAPI 종속성 제거

분류에서Dev

널 검사 생성자 매개 변수의 그루비 방식

분류에서Dev

Spring의 @RestController에서 매개 변수 개체의 URL 매개 변수 번들을 확인하는 방법

분류에서Dev

연결된 모델을 생성하지 않는 확인란 매개 변수

분류에서Dev

Gatling을 사용하여 매개 변수를 사용하여 기본 인증로드 테스트-Scala

분류에서Dev

stimulsoft (C #)의 패널을 반영하지 않는 매개 변수

분류에서Dev

cuda 커널의 구성 매개 변수

분류에서Dev

URL에서 매개 변수를 확인하여 활성화 된 메뉴

분류에서Dev

속성을 사용하여 숫자의 자릿수 확인

분류에서Dev

Guard를 사용하여 Swift 2.2에서 초기화 매개 변수 확인

분류에서Dev

Requestly Chrome 확장 프로그램을 사용하여 URL을 유지하는 매개 변수의 도메인을 변경하는 방법은 무엇입니까?

분류에서Dev

SQL 테이블 값 확인 / 반환 값을 매개 변수로 사용

분류에서Dev

매개 변수 배열을 사용하여 모듈 생성

분류에서Dev

인스턴스 속성을 기본 매개 변수로 사용할 수없는 이유는 무엇입니까?

분류에서Dev

DI-매개 변수를 사용하여 인스턴스 해결 (DryIoc을 사용하는 프리즘)

Related 관련 기사

  1. 1

    BindAttribute의 Prefix 속성을 사용하여 단일 매개 변수에 바인딩

  2. 2

    매개 변수 확장을 사용하여`mkdir -p`에 대한 인수 목록 생성

  3. 3

    Python Flask를 사용하여 루프 내 URL 매개 변수의 변경 사항을 확인하는 방법

  4. 4

    확인하는 매개 변수의 조합이 자바에 널 (null)입니다

  5. 5

    매개 변수 확장을 사용하여 다른 확장의 출력 수정

  6. 6

    매개 변수 확장을 사용하여 다른 확장의 출력 수정

  7. 7

    scanf를 사용하여 입력 매개 변수 확인

  8. 8

    매개 변수가 널인 경우 기본값 사용

  9. 9

    정규식을 사용하여 URL에 GET 매개 변수가 있는지 확인하는 방법

  10. 10

    클래스 속성을 사용하여 함수 매개 변수 값 제한

  11. 11

    커널 명령 줄 매개 변수를 사용하여 sysctl을 설정하는 방법은 무엇입니까?

  12. 12

    xamarin에서 매개 변수를 사용하여 값을 함수에 바인딩

  13. 13

    AI Platform 하이퍼 매개 변수 조정 기능을 사용할 때 매개 변수 종속성을 강제하는 방법은 무엇인가요?

  14. 14

    두 개의 연속 메서드 호출이 매번 다른 매개 변수를 사용하여 모의 메서드를 호출하는지 확인합니다.

  15. 15

    매개 변수를 사용하여 WebAPI 종속성 제거

  16. 16

    널 검사 생성자 매개 변수의 그루비 방식

  17. 17

    Spring의 @RestController에서 매개 변수 개체의 URL 매개 변수 번들을 확인하는 방법

  18. 18

    연결된 모델을 생성하지 않는 확인란 매개 변수

  19. 19

    Gatling을 사용하여 매개 변수를 사용하여 기본 인증로드 테스트-Scala

  20. 20

    stimulsoft (C #)의 패널을 반영하지 않는 매개 변수

  21. 21

    cuda 커널의 구성 매개 변수

  22. 22

    URL에서 매개 변수를 확인하여 활성화 된 메뉴

  23. 23

    속성을 사용하여 숫자의 자릿수 확인

  24. 24

    Guard를 사용하여 Swift 2.2에서 초기화 매개 변수 확인

  25. 25

    Requestly Chrome 확장 프로그램을 사용하여 URL을 유지하는 매개 변수의 도메인을 변경하는 방법은 무엇입니까?

  26. 26

    SQL 테이블 값 확인 / 반환 값을 매개 변수로 사용

  27. 27

    매개 변수 배열을 사용하여 모듈 생성

  28. 28

    인스턴스 속성을 기본 매개 변수로 사용할 수없는 이유는 무엇입니까?

  29. 29

    DI-매개 변수를 사용하여 인스턴스 해결 (DryIoc을 사용하는 프리즘)

뜨겁다태그

보관