2009-10-21 8 views
8

일반 메서드 TResult Foo<TSource, TResult>(IEnumerable<TSource> source)이 있고 TResultdynamic으로 선언 된 경우 다른 형식 선언과 다른 코드 경로를 실행하려고합니다.유형 (동적)을 어떻게 테스트합니까?

if (typeof(TResult) == typeof(int)) 
    return ExpressionFactory.CreateExpandoFunction<TSource, TResult>(); 

그러나 if (typeof(TResult) == typeof(dynamic)) 컴파일되지 않습니다 : 당신이 좋아하는 물건을 할 수있는 일반적인 유형의

. 동적 자체가 내가를 테스트해야 어떤 종류가 아닌

dyanmic x = Foo<int, dynamic>(list); 

이후 :

은 메소드가 선언으로 호출 될 때 런타임에 결정의 종류를 만들기 위해 어쨌든 있나요? IDynamicMetaObjectProvider?

편집 이것은 System.Linq.Expression 평가자에 대한 SQL 텍스트의 일부입니다. 단순히 당신이 할 수없는 동적으로 형태가 없기 때문에 말하기

if (type is struct) 
    create selector that initializes each element to result values 
else if (type is class) 
    create selector that initialize each element to new instance and set member properties 
else if (type is dynamic) 
    create selector that initializes each element to new `ExpandoObject` and populates/sets member properties 
+0

이 정보가 필요하십니까? – Gishu

답변

10

: TResult 동적 인 경우 분기하는 특정 욕망은 다음과 같은 형태 일부 의사 논리입니다. 유형이 동적 인 경우 유형이 메타 데이터에 나타나는 경우 특수 속성이 첨부 된 객체 (동적)로 기록됩니다. 본질적으로 typeof (동적)는 대부분의 목적을 위해 typeof (객체)와 다르지 않습니다.

+2

예, Debug.Write (typeof (TResult) .FullName을 수행했는데 실제로 System.Object입니다.) – dkackman

1

dynamic으로 선언 된 객체가 특정 유형의 객체 일 필요는 없습니다. 그것은 DynamicObject의 하위 클래스 일 수 있으며 (따라서 작업 조회를위한 특정 논리를 제공합니다.) 정상적인 객체 일 수도 있습니다 (@JaredPar에서 말한 것처럼).

dynamic 개체에 대해 원하는 분기 종류를 설명하면 더 나은 해결책을 찾을 수 있습니다.

+0

에 몇 가지 설명이 추가되었습니다. – dkackman

관련 문제