2010-07-12 3 views
4

:CTypeDynamic의 C# 버전이 있습니까? 문서에서

CTypeDynamic 방법은 오브젝트 자체에 의해 정의 된 변환 의미론에 따라 동적 전환을 적용한다. 동적 개체가 DynamicObject에서 상속되는 경우 CTypeDynamic 메서드는 먼저 사용자 정의 정적 변환을 사용하여 변환을 시도합니다. 사용자 정의 정적 변환이 실패하면 CTypeDynamic 메서드는 동적 변환을 사용하여 변환을 시도합니다. 동적 개체가 IDynamicMetaObjectProvider를 구현하는 경우 CTypeDynamic 메서드는 사용자 정의 된 정적 변환을 통한 동적 변환보다 우선합니다.

여기에 C#이 있나요? 아니면 VB 라이브러리를 가져와야합니까?

답변

3

C# 4.0을 사용하는 경우 동적이라고합니다. Here is the link

+0

그래, 내가 찾은 CTypeDyamic 예제를 위해 일하는 것이 를 사용하여 변환을 수행하려고합니다. 여전히 '동일'한지 궁금해합니다. –

+0

IDynamicMetaObjectProvider를 구현하여 사용자의 요구에 맞춰줍니다. –

+0

C#이 C# 런타임 바인더를 사용하고 VB는 VB 런타임 바인더를 사용하므로 정확히 동일하지는 않습니다. – codekaizen

2

이 경우 VB 라이브러리를 가져올 필요가 없습니다.

DynamicObject 파생 클래스에서 TryConvert를 재정의하면 C#을 사용하면 암시 적 또는 명시 적 형변환을 통해 암시 적으로 호출 할 수 있습니다.

//explicit conversion 
String myObject = (String)myDynObject; 

//implicit conversion 
String myObject = myDynObject; 

VB.NET은 명시 적 변환 만 지원합니다. C#은 암시 적 및 명시 적을 모두 지원합니다.

여기에 MSDN의 link이 나와 있습니다.

희망이 도움이됩니다.

+0

VB 개발자는 런타임에 바인딩 된 코드에 Option Strict Off를 사용하는 것이 합리적이라고 생각합니다. –

+0

나는 그렇게 생각한다. 나는 VB.NET 개발자가 아니기 때문에 C# dev입니다 ...하지만 이해가됩니다. –

0

먼저 동적으로 캐스팅 한 다음 대상 유형을 트릭해야합니다.
동적 C# 4.0/VS 2010에서 사용할 수 있습니다.

C# 3.0/VS2008에서는 식을 사용하여 작업 할 수 있습니다. 올바르게 기억한다면 "MiscUtil"라이브러리에는 일반 연산자 클래스에서 변환 연산자를 사용하는 함수가 포함되어 있습니다.

0

짧은 대답 당신은 아무것도 가져올 필요가 없습니다

. 암시 적 및 명시 적 C# 변환과 "동적"키워드를 사용하십시오. D Hoerster의 답이 맞습니다.

긴 대답

C#을 동적 객체를 처리하기 위해 별도의 유형이 - 타입은 "동적"입니다. 그러나 VB에서는 동적 인 동작이 늦은 바인딩을 통해 구현되기 때문에 이에 대한 전용 유형이 없습니다. 그래서 VB에서 실제 동적 바인딩을 필요로하는 동적 객체는 때때로 "객체"와 구별하기가 어렵습니다. CType은 "개체"를 유형으로 변환합니다. 대부분의 경우 괜찮습니다. 그러나 IDynamicMetaObjectProvider 인터페이스의 구현을 처리 할 때 문제가 발생할 수 있습니다. CType은 "개체"또는 "동적 개체"를 처리하는지 이해할 수 없습니다. 다른 개체와 구별 할 구문이 없으며 CType은 후기 바인딩을 통해 정의 된 모든 개체에 대해 동적 바인더를 호출하지 않으려 고합니다. 그것은 다루는 모든 객체가 "동적 객체"가 아니라 "객체"라고 가정합니다. 그래서 어떻게 든 컴파일러가 동적 객체를 다루고 있음을 알 필요가 있습니다. 새로운 "동적"유형을 만드는 대신 VB 팀은 하나의 변환 기능 (CTypeDynamic)을 추가하기로 결정했습니다.이것은 동적 유형을 다른 유형으로 변환한다는 것을 컴파일러에게 명시 적으로 알려줍니다 (다시 말하지만 C#에서는 동적 키워드를 사용하여 객체를 이미 정의 했으므로 컴파일러는 이미 그 내용을 알고 있기 때문에 필요하지 않습니다).

문제의 좋은 예는 DynamicObject.TryConvert 방법입니다. VB 예제에서 CTypeDynamic을 CType으로 바꾸면 예외가 표시됩니다. 다시 말하지만 CType은 동적 런타임 바인더에 대해 아무것도 모르기 때문입니다. 그러나 C#에서는 런타임 바인더가 dynamic 키워드에 의해 정의 된 모든 객체에 대해 호출되므로이 특수 함수가 필요하지 않습니다.

0

VB의 CTypeDynamic()에 해당하는 C# 함수는 Convert.ChangeType()입니다.

이름의 변경은 C# 함수를 dynamic 형식 메커니즘이 아닌 형식 변수에 따라 런타임에 형식 변환을 설정하는 것으로 구분하는 데 도움이됩니다.

Convert.ChangeType 값 지정된 개체에 해당하는 특정 유형의 객체를 반환. Conversion.CTypeDynamic

지정된 형식 대상물 변환.

...

CTypeDynamic 방법은은 TargetType 파라미터에 의해 지정된 타입 Expression 매개 변수로 전달 된 객체로 변환한다. 개체가 동적 개체 인 경우 CTypeDynamic 메서드는 사용 가능한 동적 변환을 적용합니다.

은 ...

CTypeDynamic 방법은 먼저 사용자 정의 정적 변환이

+0

CTypeDynamic에 전달 된 개체는 IConvertible 인터페이스를 구현해야합니다. 이는이 방법의 유용성을 제한합니다. –

+0

또한 C#의 'dynamic'키워드로 (다른 사람들이 언급했듯이) CTypeDynamic에 해당 할 필요조차 없습니다. –

+0

@DaveDoknjas ChangeType이 IConvertible (CTypeDynamic 아님)을 필요로한다는 것을 의미한다고 생각합니다. 내게는 코스에 대한 것과 같고 심각한 제한이 아닌 것 같습니다 ... 또한 동적 유형에 대한 제 이해가 잘못되어 있지 않으면 동일한 기능을 제공하지 않습니다. 그것은'Type' 타입의 인자에 기반한 런타임 변환을 제공하지 않습니다. 즉, 명시적인 캐스트입니다. 그러나 타입은 실행시'Type' 변수에 의해 결정될 것입니다. 예를 들어 동적 유형은 [여기] (https://stackoverflow.com/questions/9009986/how-to-cast-an-object-to-a-type-extracted-at-runtime)에 언급되지 않았습니다. – u8it

관련 문제