2014-11-26 2 views
0

나는 그것 말하고, 내 코드에서 문제에 직면하고있다 system.int32system.double로 변환 할 수 없습니다 캔트, 여기에 내가이 내 코드객체는 '선택 System.Int32'는

입니다 형식으로 변환 할 수 없습니다 4 개의 문자열 변수와 2 개의 정수 변수를 가진 객체. 그것의

객체 말을 내 objectfieldname 변수 i가 올바른 데이터 유형의 모든 변수를 얻고에서

public class MyObject 
{ 
public int id; 
public string name1; 
public string name2; 
public string name3; 
public string name4; 
public int id2; 

} 

/*Converts DataTable To List*/ 
    public static List<TSource> ToList<TSource>(this DataTable dataTable) where TSource : new() 
    { 
     var dataList = new List<TSource>(); 

     const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic; 
     var objFieldNames = (from PropertyInfo aProp in typeof(TSource).GetProperties(flags) 
          select new { Name = aProp.Name, Type = Nullable.GetUnderlyingType(aProp.PropertyType) ?? aProp.PropertyType }).ToList(); 
     var dataTblFieldNames = (from DataColumn aHeader in dataTable.Columns 
           select new { Name = aHeader.ColumnName, Type = aHeader.DataType }).ToList(); 
     var commonFields = objFieldNames.Intersect(dataTblFieldNames).ToList(); 

     foreach (DataRow dataRow in dataTable.AsEnumerable().ToList()) 
     { 
      var aTSource = new TSource(); 
      foreach (var aField in objFieldNames) 
      { 
       PropertyInfo propertyInfos = aTSource.GetType().GetProperty(aField.Name); 
       propertyInfos.SetValue(aTSource, dataRow[aField.Name], null); 
      } 
      dataList.Add(aTSource); 
     } 
     return dataList; 
    } 

하지만 dataTblFieldNames 변수의 변환 INT에 두 배로, 그래서 난 foreach looppropertyinfos에서 문제에 직면하고있다 'System.Double'형식의 'System.Int32'형식으로 변환 할 수 없습니다.

아무쪼록이 문제를 해결할 수 있도록 도와주세요.

+0

어디서 오류가 있습니까? 그것을 어디에서 개조합니까? – Shaharyar

+5

Reflection/LinQ를 썼다는 것을 믿을 수 없으며 이제는 간단한 Int32/double 변환에 문제가 있습니다. 어느 선 이요? – nvoigt

+0

그래서 foreach 루프에서 propertyinfos.setvalue의 문제에 직면하고 있습니다. 'System.Double'형식의 Object가 'System.Int32'형식으로 변환 될 수 없습니다. – user1557020

답변

2

당신은 Convert.ChangeType method 사용할 수 있습니다

Convert.ChangeType(dataRow[aField.Name], propertyInfos.PropertyType) 

그것은 몇 가지 숫자 변환을 시도 할 것이다 (double에서 int로 전환처럼, 부동 소수점에서 이진 표현의 변화는 정수 (2의 보수)하는) 및 string에서 /로 일부 서식 지정/구문 분석.

+0

천재 완벽한 대답. 고마워. – user1557020

0

입력 dataRow[aField.Name]System.Double이고 입력하려는 필드는 System.Int32입니다. 그러나 Visual Studio는 이미 당신에게 그렇게 큰소리로 그리고 분명하게 말했습니다.

은 무엇을 해야할지 모르겠으므로 무엇을해야할 지 말할 수 없습니다.해야합니다. 캐스팅하여 double을 잘라 버리시겠습니까? 반올림 해! 어쩌면 그건 잘못된 분야일까요? 우리는 모른다. 당신이 결정합니다.

위의 코드를 생각해 냈지만 여전히 오류를 이해하지 못했을 가능성을 고려하면 전체 밤 수면과 좋은 커피를 얻거나 원래 이것을 작성한 사람에게 물어 보는 것이 좋습니다. 암호.

+0

안녕하세요, 제 질문에 명확하게 내 문제가 무엇인지 말한 것을보십시오. 대답 할 수 없다면 맡겨주세요. 나도 분명히 말하는 대 잘 알고 있습니다. 내 질문에 왜 var에 objFieldNames var에 설정 (propertyInfos.SetValue (aTSource, dataRow [aField.Name], null)) 동안 설정하는 동안 올바른 데이터 형식을 변경하는 방법입니다/왜 그것의 이중으로 변경, 내 질문입니다. – user1557020

+1

나는 내 인생에있어 최악의 대답 중 하나 :-). – user1557020

+1

질문에서 첫 번째 문장과 실제 오류 메시지가 동일하지 않다는 점을 이해하기 시작하십시오. ** 속성 **은 int 유형이고 ** 데이터 **는 double 유형입니다. 맞지 않는다. 데이터를 변환해야합니다. 그리고 당신이 이것을 어떻게하고 싶은지 모르기 때문에 나는이 작은 운동을 당신에게 맡길 수 있습니다. – nvoigt

1

값을 지정하기 전에 속성 유형을 찾고 int 유형에 double 유형을 직접 할당 할 수 없기 때문에 값을 필요한 유형으로 변환해야합니다.

if (propertyInfos.PropertyType == typeof(int)) 
{ 
    propertyInfos.SetValue(aTSource, Convert.ToInt32(dataRow[aField.Name]), null); 
} 
+0

많은 사람, 그 작업 완벽에 고마워. Atlast 사람은 내 질문을 올바르게 이해했습니다. – user1557020

+0

하지만 한 가지 질문은 집합 중에 이중으로 취급하는 이유는 사실 데이터 유형이 int 일뿐입니다. – user1557020

+0

@ user1557020 checkable 값은 datatable에서옵니다. 나는 그것이 두 배라고 생각한다. – Sandeep