2009-10-21 45 views
8

私は汎用メソッドTResult Foo<TSource, TResult>(IEnumerable<TSource> source)を持っています。TResultdynamicと宣言されている場合は、他の型宣言とは異なるコードパスを実行します。typeof(dynamic)のテスト方法を教えてください。

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

しかしif (typeof(TResult) == typeof(dynamic))コンパイルされません:あなたはのようなものを行うことができ、通常のタイプについて

。ダイナミック自体は私がテストする必要がありますどのようなタイプではありません

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

ので:

は、メソッドが宣言して呼び出されたときに、実行時に決意のこの種を作るためにとにかくありますか? IDynamicMetaObjectProvider

EDIT これは、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(dynamic)はほとんどの目的でtypeof(object)と変わらないということです。

+2

はい、Debug.Write(typeof(TResult).FullNameを実行しました。実際にはSystem.Objectです。 – dkackman

1

dynamicと宣言されたオブジェクトは、特定の種類のオブジェクトである必要はありません。それはDynamicObjectのサブクラスになることができます(したがって、操作ルックアップのための特定のロジックを提供します)が、通常のオブジェクトにもなります(@ JaredParによると)。

dynamicオブジェクトに対してどのような種類のブランチを作成するか説明すると、より良い解決策を見つけることができます。

+0

には説明が追加されています – dkackman

関連する問題