2010-05-04 3 views
1

나는 alredy이 있습니다 null 가능 여부. 나는 어떻게 그 일을하고있는 그대로 전화를 유지합니까? 그게 가능합니까? 당신이 널 (null)로 더욱를 단축 할 수 있지만, 괜찮이Null 허용 <T>

Params.Add(new SqlParameter("@EntityID ", GetDBValue<int>(EntityID))); 

답변

3

일반 버전 :에

public static object GetDBValue<T>(Nullable<T> ObjectEvaluated) where T : struct 
{ 
    if (ObjectEvaluated.HasValue) 
    return ObjectEvaluated.Value; 
    else 
    return DBNull.Value; 
} 

그러나 통화 변경 :

나는처럼 작동 할 수 있습니다 - 통합 연산자 :

public static object GetDBValue<T>(Nullable<T> ObjectEvaluated) 
    where T : struct 
{ 
    return ObjectEvaluated ?? (object)DBNull.Value; 
} 

누락 된 부분은 일반적인 pa 당신이 그것을 부를 때 벼리 자. C#의 형식 유추는 당신을 위해 그것을 알아낼 것이다

int? x = null; 
object y = GetDBValue(x); 
+0

문제는 해당 호출이 GetDBValue (x)가 아니지만 GetDBValue (x)이 될 것입니다 !!! 그게 내 질문의 이유는 같은 호출을 유지하는 기능의 n 버전을 갖고 싶지 않아, 그리고 그것은 아마도 어쩌면 누군가가 가능하지 않을 것 같아요 ... – user331940

+0

@ferch : 아니, 그게 아니야. 옳은. C#에서는 제네릭에 대한 유추를 입력합니다. 이 코드는 메서드 호출에서 ''없이 컴파일됩니다. 그것은이 답변서에 쓰여진대로 정확하게 작동합니다. – Aaronaught

+0

죄송합니다. Aaronaught, 정확합니다. 내가 처음 시도하고 컴파일 오류가있어 뭔가 잘못했다. 그것은 매력으로 작동합니다. 만약 null 값이 아니라 null 값을 필요로하기 때문에 if 값을 줄입니다. 감사합니다. – user331940

1

(마지막 예)에는 EntityID는 nullable 형식은 다음 컴파일러는 기본 유형을 지정하지 않고 GetDBValue 전화를 알 수있는 경우.

1

포인트가 인 것은 확실하지 않습니다. 무엇이 이 이미 박스 (object을 반환하기 때문에)를 가지고 있다면, CLR로 하여금 그렇게 할 수도 있습니다. 간단히 : 혜택 추가 제네릭 여기에 많이 없다

public static object GetDBValue(object ObjectEvaluated) 
{ 
    return ObjectEvaluated ?? DBNull.Value; 
} 

(우리는 T를 사용하지 않기 때문에).

분명히 일 수 있습니다. 일반적인 방법을 추가하지만 무엇이 추가됩니까?