2014年10月22日
川俣晶の縁側ソフトウェア技術雑記total 4525 count

WhereメソッドのMemberInfoを取得する方法

Written By: 川俣 晶連絡先

「WhereメソッドのMemberInfoを取得する方法。執念深く探すと方法があるものだな。Invoke Enumerable.Where (or other overloaded generic method) using reflectionにあった」

「どんな方法?」

「こんな方法」

        Type enumerableType = typeof(Enumerable);

        MemberInfo[] members = enumerableType.GetMember("Where*");

        MethodInfo whereDef = (MethodInfo)members[0]; // Where<TSource>(IEnumerable<TSource, Func<TSource,Boolean>)

        Type TSource = whereDef.GetGenericArguments()[0]; // TSource is the only generic argument

        Type[] types = { typeof(IEnumerable<>).MakeGenericType(TSource), typeof(Func<,>).MakeGenericType(TSource, typeof(Boolean)) };

        MethodInfo method = enumerableType.GetMethod("Where", types);

「ポイントはどこだい?」

「TSourceを取得するステップ」

「つまり具体的な型ではない仮の型情報を取得できるわけだね」

「ちなみに、GetMethodではなく、GetMethodsで列挙させて最初の1つを取得してくるという方法も試して上手く行ったが、【最初の1つ】という条件では将来拡張されたときに誤動作するからな。もっと調査を続けていたら見つかった」

「考えることは海の向こうでも同じってことだね」

「そうそう。同じような解決策を試みて同じような問題にはまって同じような情報を模索している」

Facebook

2014年10月22日
川俣晶の縁側ソフトウェア技術雑記total 4525 count

WhereメソッドのMemberInfoを取得する方法

Written By: 川俣 晶連絡先

「WhereメソッドのMemberInfoを取得する方法。執念深く探すと方法があるものだな。Invoke Enumerable.Where (or other overloaded generic method) using reflectionにあった」

「どんな方法?」

「こんな方法」

        Type enumerableType = typeof(Enumerable);

        MemberInfo[] members = enumerableType.GetMember("Where*");

        MethodInfo whereDef = (MethodInfo)members[0]; // Where<TSource>(IEnumerable<TSource, Func<TSource,Boolean>)

        Type TSource = whereDef.GetGenericArguments()[0]; // TSource is the only generic argument

        Type[] types = { typeof(IEnumerable<>).MakeGenericType(TSource), typeof(Func<,>).MakeGenericType(TSource, typeof(Boolean)) };

        MethodInfo method = enumerableType.GetMethod("Where", types);

「ポイントはどこだい?」

「TSourceを取得するステップ」

「つまり具体的な型ではない仮の型情報を取得できるわけだね」

「ちなみに、GetMethodではなく、GetMethodsで列挙させて最初の1つを取得してくるという方法も試して上手く行ったが、【最初の1つ】という条件では将来拡張されたときに誤動作するからな。もっと調査を続けていたら見つかった」

「考えることは海の向こうでも同じってことだね」

「そうそう。同じような解決策を試みて同じような問題にはまって同じような情報を模索している」

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
2014年
10月
25日
1つのSQLサーバを共有するAzure WebSiteとComputeService両用のWebアプリを作成する方法
3days 0 count
total 4562 count
【技術雑記】の前のコンテンツ
2014年
10月
22日
任意の型オブジェクトに対するIEnumerable<T>の型オブジェクトを得る方法
3days 0 count
total 4043 count
【技術雑記】のコンテンツ全リスト【技術雑記】の表紙

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20141022132612
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Powered by MagSite2 Version 0.27 (Alpha-Test) Copyright (c) 2004-2018 Pie Dey.Co.,Ltd.