トップ回答者
ラムダ式の共変性、反変性

質問
-
Expression<Func<String>> e1=() => "ABC"; var 答え1=e1.Compile()(); Expression<Func<Object>> e2=e1 as Expression<Func<Object>>; var 答え2=e2.Compile()();
上記のコードでやりたいことは色々な型を返すExpression<Func<T>>をExpression<Func<Object>>に入れ、それからCompileして値を取得したいのです。
そもそもExpression<Func<Object>>にキャストできません。
これはコレクションクラスにたくさんのExpression<Func<T>>を代入してから使いたいからです。
これを実現することは可能でしょうか?
回答
-
やってみました。
こんなシンプルに解決できるとは思いませんでした。これで目的は達成できます。ありがとうございました。
とりあえず別の解では
Expression<Func<String>> e1=() => "ABC"; Object Object型になったラムダ式=e1; var ExpressionのGenericType=Object型になったラムダ式.GetType(); var Compile=ExpressionのGenericType.GetMethod("Compile",Type.EmptyTypes); //Expression<Object> e2=e1 as Expression; var 実行Delegate=Compile.Invoke(Object型になったラムダ式,new Object[0]) as Delegate; var 答え=実行Delegate.DynamicInvoke(null);
でも出来ました。- 回答としてマーク 和和和 2010年7月30日 4:29
すべての返信
-
やってみました。
こんなシンプルに解決できるとは思いませんでした。これで目的は達成できます。ありがとうございました。
とりあえず別の解では
Expression<Func<String>> e1=() => "ABC"; Object Object型になったラムダ式=e1; var ExpressionのGenericType=Object型になったラムダ式.GetType(); var Compile=ExpressionのGenericType.GetMethod("Compile",Type.EmptyTypes); //Expression<Object> e2=e1 as Expression; var 実行Delegate=Compile.Invoke(Object型になったラムダ式,new Object[0]) as Delegate; var 答え=実行Delegate.DynamicInvoke(null);
でも出来ました。- 回答としてマーク 和和和 2010年7月30日 4:29
-
横からすいません。
> 何が基本かよく分かっていないのでそのつど必要とされる技術を調べるという方針でやっています。
なるほど、そういう方も多いかも知れません。
.NET で開発する場合、開発のベースとすべき書籍にこういうのがあります。レビュアーのひにものさんのおっしゃる通り、全ての.Net開発者が読むべき本だと思います。
ただし翻訳に難があり間違いもかなり多いですが、第二刷以降はエラッタがかなり修正されているという話です。MSDN だと、クラス ライブラリ開発のデザイン ガイドライン。上記の書籍は、このガイドラインをより詳細に解説したものです。
あと私はまだ読んでないのですが、.NET Framework 全体の基礎を知るにはこちらだという話です。
プログラミングMicrosoft .NET Framework 第2版
ひらぽん http://d.hatena.ne.jp/hilapon/