2012-02-06 3 views
2

제목이 혼란스럽고 더 잘 설명하려고합니다. 기본적으로 방법 내에서 수행하고자하는 작업은 다음과 같습니다.참조 유형을 제네릭 유형으로 변환하십시오.

if (record["id"] != DBNull.Value) _id = Convert.ToInt32(record["id"]); 
else id = -1; 

데이터베이스에 저장된 여러 유형에 대해이 기능을 사용하고 싶습니다. (그래서 문자열이라면 문자열로 변환합니다). 이 작업을 수행하는 방법은 아무 문제가 없으며 메서드로 처리하려고했습니다. 나는 이것을 가지고 있지만 C#은 자동으로 int를 객체로 변환하지 않을 것이다. 아이디어?

private void Load(ref object var, object obj, object def) 
    { 
     if (var is int) 
     { 
      var = Convert.ToInt32(obj); 
     } 
    } 

    int _id; 
    Load(ref _id, record["id"], -1); 

명확히하기 위해 내 오류는 "ref int에서 ref object로 변환 할 수 없습니다"입니다. 도움 주셔서 감사합니다.

답변

3

당신은 Convert.ChangeType()을 사용할 수 있습니다 및 일반 귀하의 방법을합니다

private void Load<T, U>(out T value, U obj, T defaultValue) 
{ 
    if (obj is DBNull) 
     value = defaultValue; 
    else 
     value = (T)Convert.ChangeType(obj, typeof(T)); 
} 

지금 당신은 단지 다음과 같이 사용할 수 있습니다 (간체 예를 들어, 확실하지 않은 당신을위한 def 필요) :

int id; 
object foo = 42; 
Load(out id, foo, 1); 
+0

여전히 동일한 오류가 발생합니다. 매개 변수 유형이 일치하지 않습니다. – mrK

+0

또한 def는 단지 기본값입니다. – mrK

+0

그렇다면 foo == DBNull.Value 일 경우 어떻게됩니까? – mrK

1

우선 off, var은 C# 3.0 이상 (VS 2008 이상)의 예약어입니다.

요즘까지는 이것을 일반적인 것으로 설정하려고합니다. 그런 식으로 입력 한 변수의 실제 유형을 발견하고 강하게 입력 한 것처럼 대소 문자를 사용하여 작업 할 수 있습니다.

private void Load<TVar, TSet>(ref TVar var, TSet obj, TVar def) 
{ 
    //this is a little heavy-handed, but in pretty much any situation where 
    //this can fail, you just want the basic type. 
    try 
    { 
     if (var is IConvertible && obj is IConvertible) 
      var = (TVar)Convert.ChangeType(obj, typeof(TVar)); 
     else 
      var = (TVar)obj; //there may just be an explicit operator 
    } 
    catch(Exception) 
    { 
     var = def; //defined as the same type so they are always assignable 
    } 
} 
관련 문제