2011-09-04 2 views
3

여러 번 물어 봤지만 개념을 이해하는 데 어려움을 겪고 있습니다. <T>.동적 변환 C#

사용자 정의 GridView에서 작업 중이며 CellUpdate 이벤트에 Cell.Value 속성을 설정하고 싶습니다. 문제는 대부분의 경우 셀의 제어 입력에서 문자열을 가져와야하지만 (동적 인 방법으로) 이것을 String (이 경우 _Value으로 표현됨)으로 변환하는 것이 좋습니다. 목적.

희망 사항 중 일부는 이해가됩니다. 감사합니다.

+0

에 대한 내 대답을 살펴보십시오 (int, float, CustomType 등과 같은) 원래 객체의'Type'을 가져 오는 것입니다. –

+0

당신은 셀에 저장된 원래의 값의 타입을 알지 못한다는 것을 의미합니까? – Zenwalker

+0

Cell.Value는 onject 유형이므로 Cell.Value.GetType()을 실행하여 내가 추측하는 유형을 얻을 수 있습니다. –

답변

3

일반 (<T>) 및 동적 인 두 가지 반대 개념입니다. generics는 컴파일 타임에 알려 져야하며 동적은 런타임에 해결되어야합니다. 따라서 유형 (<T>)을 동적으로 만 알고있는 경우 리플렉션을 사용하지 않으면 일반 메서드를 호출 할 수 없습니다.

특정 요구 사항 및 처리중인 코드에 따라 다른 해결책이있을 수 있습니다.

+0

그래, 나는 런타임에만 형식을 알 것이다. 내가 생각할 수있는 유일한 해결책은 if (객체.GetType(). ToString() == "System.Int32") –

+0

@Esh, 다른 해결책도있을 수 있습니다. –

0

쉬운 자동 방법이 없습니다. Convert.ChangeType()을 사용하여 프리미티브 (즉, IConvertable을 구현하는 유형)간에 비교적 쉽게 변환 할 수 있습니다. 하지만 그렇지 않으면 스스로 해결할 수 있습니다. 내가 사용하지 않은 -

object v = myCell.Value; 
if(v is int) 
{ 
    int vInt = (int)v; 
    // ... 
} 
else if(v is string) 
{ 
    string vStr = (string)v; 
    // ... 
} 
else if(v is MyClass) 
{ 
    MyClass vMyClass = (MyClass)v; 
    // ... 
} 
// ... 

참조 유형의 경우, 그것은 as를 사용하고 null를 확인하는 것이 바람직 주 있음 : 예를 들어

이는 원유,하지만 그 일의 가능한 방법입니다 그것은 추악한 코드, 많은 지역 변수들로 이어지기 때문에 이상입니다. 나는 그것을 피하는 것을 선호하며, 나는 성과 위약을 지불합니다.

0

제네릭과 반사음은 매우 단단하여 사용하지 않는 것이 좋습니다. 두 가지를 함께 사용하고자하는 시점에 이르면 일반적으로 시작하는 것이 좋지 않은 디자인입니다. 그것이 나쁜 디자인이 아닐지라도, 당신이이 과정을 취할 것을 요구하지 않는 대안을 고려하십시오.

제네릭과 리플렉션에 대한 경험이 약간 있었지만 권장하지 않습니다.

0

CellUpdate 이벤트에 해당하는 (개체 발신자) 있다고 가정합니다. 보낸 사람을 사용자가 컨트롤 할 수 있어야하며 해당 지점의 속성을 사용할 수 있어야합니다. 정확한 형식을 제공하기가 어렵습니다. 유형이 어떻게 설정되었는지는 모르지만 (GridViewCell) 발신자와 비슷할 수 있습니다. 텍스트; 이렇게하는 방법은 여러 가지가 있지만 특정 구현에 따라 크게 달라집니다.

0

당신은 하나, TypeConveters를 사용할 수있는 시스템 유형에 내장하거나, 사용자 정의 유형에 대해 직접 작성 예 : 그것은 가능

TypeConverter converter = TypeDescriptor.GetConverter(type); 
if (converter.CanConvertFrom(typeof(string)))... 

다른 StackOverflow question