2012-02-29 1 views
2

는 데프 당신이 볼 수어떤 방법이 튜플의 유형을 얻기 위해 <> 항목 (들)

IEnumerable<Tuple<string, double>> GetValues() 
{ 
    .... 
     yield return new Tuple<string,double>(dataRow["<field>"].ToString(), 
       (double)Convert.ChangeType(dataRow["<field>"], typeof(double))); 
    .... 

    // and more code similar to above based on other custom logic 

} 

는, 주조/coerc'ng의, SA의 많은 을 두 배로하는 곳은 변화가 여전히 수도 다시 문자열 또는 다른 데이터 유형

그것은 가능해야한다 약간의 변환 누락에 대해 걱정할 그래서 몇 가지 일반적인 도우미를 만들 수 있습니다 서명에 정의 된 튜플의 데이터 유형을 얻을 수 없습니다 수있는 방법이 있는지 궁금로 반사? 나는 희망 !

답변

5

이 클래스가 DataRow 클래스 인 경우 Field이라는 멋진 확장 메서드가 있습니다.

var x = Tuple.Create<int, string>(0, "test"); 
var y = x.GetType().GetGenericArguments(); 
y[0].Name = "System.Int32"; 

당신은 "대해서 typeof()"를 사용하여 컴파일 타임에이 같은 정보를 얻을 수 있습니다, 또는 : 당신은 튜플의 인스턴스가있는 경우

IEnumerable<Tuple<T1, T2>> GetValues<T1, T2>(String field1, String field2) 
{ 
    .... 
     yield return new Tuple<T1,T2>(dataRow.Field<T1>("<field>"), 
       dataRow.Field<T2>("<field>")); 
    .... 
} 
+0

DBNULL을 처리하는 데 좋은 방법이 있습니까? – Kumar

+0

'GetValues ​​ (...)' –

2

당신은 반사를 통해 제네릭 형식 매개 변수를 얻을 수 있습니다 다음과 같이 런타임에 리플렉션을 사용합니다.

public Tuple<string, double> DoSomething() 
{ 
    var y = typeof(Tuple<string, double>).GetGenericArguments(); 
    var z = MethodBase.GetCurrentMethod().ReturnType.GetGenericArguments(); 
} 

나는 이것이 정말로 도움이 될 것이라고 생각하지 않습니다. 당신은 런타임시에 얻은 타입 정보를 컴파일 타입에서 일반적인 매개 변수에 바인드 할 수 없기 때문에, 많은 작업을 절약하지는 못한다. 어딘가에 반복적으로 데이터 유형을 지정해야 할 필요가 있습니다.

크리스 샤인 (Chris Shain)의 대답 (Field<T> 방법)은 실제로 여기로가는 길입니다.

+0

과 같이 T 대신에 'Nullable '을 전달하면 위와 같이 메소드 인스턴스에서 튜플 인스턴스를 가져올 수 있습니까? – Kumar

+0

예, typeof()를 사용합니다. 내 대답을 업데이트 할게. –

+0

죄송합니다 나는 var y = GetTheReturnTypeOfThisMethod()의 라인을 따라 뭔가가 있다면 의미; – Kumar

관련 문제