1

MethodInfoメソッドのオブジェクトを取得しようとしています:

Any<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

私が抱えている問題は、Func<TSource, Boolean>ビットの型パラメーターを指定する方法を考え出すことです...

MethodInfo method = typeof(Enumerable).GetMethod("Any", new[] { typeof(Func<what goes here?, Boolean>) });

助けていただければ幸いです。

4

2 に答える 2

3

必要なジェネリック メソッドを返すために、すべてのメソッドを取得してフィルター処理する拡張メソッドを作成できます。

public static class TypeExtensions
{
    private class SimpleTypeComparer : IEqualityComparer<Type>
    {
        public bool Equals(Type x, Type y)
        {
            return x.Assembly == y.Assembly &&
                x.Namespace == y.Namespace &&
                x.Name == y.Name;
        }

        public int GetHashCode(Type obj)
        {
            throw new NotImplementedException();
        }
    }

    public static MethodInfo GetGenericMethod(this Type type, string name, Type[] parameterTypes)
    {
        var methods = type.GetMethods();
        foreach (var method in methods.Where(m => m.Name == name))
        {
            var methodParameterTypes = method.GetParameters().Select(p => p.ParameterType).ToArray();

            if (methodParameterTypes.SequenceEqual(parameterTypes, new SimpleTypeComparer()))
            {
                return method;
            }
        }

        return null;
    }
}

上記の拡張メソッドを使用すると、意図したものと同様のコードを記述できます。

MethodInfo method = typeof(Enumerable).GetGenericMethod("Any", new[] { typeof(IEnumerable<>), typeof(Func<,>) });
于 2010-10-27T18:02:14.873 に答える
2

メソッドのジェネリック パラメータ (この場合は TSource) で構築されたジェネリック型を作成する必要があるため、1 回の呼び出しでそれを取得する方法はありません。また、メソッドに固有であるため、メソッドを取得してジェネリック Func 型を構築する必要があります。鶏と卵の問題か。

ただし、できることは、Enumerable で定義されたすべての Any メソッドを取得し、それらを繰り返し処理して必要なメソッドを取得することです。

于 2008-11-28T16:19:00.110 に答える