私はリフレクションが初めてで、以下のコードを試していました
var queryableLastMethodInfo = typeof(Queryable).GetMethod("Last", new Type[]{ typeof(IQueryable<>) });
ただし、queryableLastMethodInfoは常にnullを返します。
助けていただけますか?
私はリフレクションが初めてで、以下のコードを試していました
var queryableLastMethodInfo = typeof(Queryable).GetMethod("Last", new Type[]{ typeof(IQueryable<>) });
ただし、queryableLastMethodInfoは常にnullを返します。
助けていただけますか?
これにより、述語を取らない "Last" 拡張メソッドの MethodInfo が得られるはずです。
var queryableLastMethodInfo = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
.FirstOrDefault(x => x.Name == "Last" && x.GetParameters().Count() == 1);
...そして、これはあなたに他のものを与えるはずです:
var queryableLastMethodInfo = typeof(Queryable).GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)
.FirstOrDefault(x => x.Name == "Last" && x.GetParameters().Count() == 2);
すべてのLastメソッドを見つけて、パラメーターが 1 つだけのメソッドを選択できます。
var method = typeof (Queryable).GetMethods()
.Where(m => m.Name == "Last")
.First(m => m.GetParameters().Length == 1);
一般的なケースは、この質問と回答で説明されています。
Queryable が "Last" と呼ばれる新しいメソッドを受け取り、パラメーターを 1 つしかとらない場合、コードが失敗するリスクを冒さないでください。
正確さは決してそれほどではありません。
var queryableLastMethodInfo = typeof(Queryable).GetMethods().Single(_Method => _Method.Name == "Last" && _Method.IsGenericMethod && _Method.GetGenericArguments().Length == 1 && _Method.GetParameters().Length == 1 && _Method.GetParameters().Single().ParameterType == typeof(IQueryable<>).MakeGenericType(_Method.GetGenericArguments().Single()));