Ich mache eine kleine Änderung Ihrer Lambda-Abfrage.
Wenn der Parametertyp si generic Sie, dass so machen müssen:
ich hinzufügen
MethodInfo foo1 = (from m in t.GetMethods(BindingFlags.Public | BindingFlags.Static)
where m.Name == name
&& m.GetGenericArguments().Length == genericArgTypes.Length
&& m.GetParameters().Select(pi => pi.ParameterType.IsGenericType ? pi.ParameterType.GetGenericTypeDefinition() : pi.ParameterType).SequenceEqual(argTypes) &&
(returnType==null || (m.ReturnType.IsGenericType ? m.ReturnType.GetGenericTypeDefinition() : m.ReturnType) == returnType)
select m).FirstOrDefault();
if (foo1 != null)
{
return foo1.MakeGenericMethod(genericArgTypes);
}
return null;
pi.ParameterType.GetGenericTypeDefinition()
und
(m.ReturnType.IsGenericType ? m.ReturnType.GetGenericTypeDefinition() : m.ReturnType) == returnType)
Auf diese Weise arbeitet das Verfahren sehr feine
Beispiel:
Mit der Modifikation des Verfahrens i diese Erweiterung Methode
public static IQueryable<T> FilterCulture<T>(this Table<T> t, IDatabaseFilter filter)
Mit meinem neuen Helfer wie diese
var QueryableExpression = MethodInfoHelper.GetGenericMethod(typeof(LinqFilterExtension), "FilterCulture", new Type[] { rowType }, new Type[] { typeof(Table<>), typeof(IDatabaseFilter) }, typeof(IQueryable<>));
die Unterschrift meines Helfer nennen kann, ist
public static MethodInfo GetGenericMethod(Type t, string name, Type[] genericArgTypes, Type[] argTypes, Type returnType)
Sie fehlen einen Rückgabetyp in Ihren Methodendefinitionen. – Ray
in der Tat, nicht mehr, danke. –