Я не понимаю, почему GetMethod
возвращает null
- два раза при method1
и method
Type model = AssemblyHelper.GetTypeByClassName(Assembly.GetExecutingAssembly(), modelName + MappingColums.Tokens.Validation); // MappingColums.Tokens.Validation = "Validation"
для целей тестирования, я пытаюсь получить метод дважды:
MethodInfo method1 = model.GetType().GetMethod(MappingColums.Tokens.Get + modelName); // MappingColums.Tokens.Get + modelName = "Get" + "Product"
MethodInfo method = model.GetType().GetMethods().FirstOrDefault(x => x.Name == MappingColums.Tokens.Get + modelName && x.GetParameters().Count() == 0);
object result = method.Invoke(model, null);
ниже класса и метода, который я хочу использовать с помощью отражения.
public class ProductValidation
{
private IProductRepository repositoryProduct;
public ProductValidation(IProductRepository repoProduct)
{
repositoryProduct = repoProduct;
}
public ICollection<Product> GetProduct()
{
return repositoryProduct.Products.ToList();
}
}
Я не знаю, имеет ли это значение, но я использую ASP.NET Core MVC
.Там, где я отлаживаю Type model
сразу за AssemblyHelper.GetTypeByClassName
, на Declared Methods: {System.Collections.Generic.ICollection1[AureliaCMS.Models.Entities.Product] GetProduct()}
Пожалуйста, дайте мне совет, где искать проблему.
РЕДАКТИРОВАТЬ: Спасибоочень много - вы оба были правы - Klaus Gütter
и Aldert
рабочий код
public static class AssemblyHelper
{
public static IEnumerable<Type> GetLoadableTypes(Assembly assembly)
{
if (assembly == null) throw new ArgumentNullException(nameof(assembly));
try
{
return assembly.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
return e.Types.Where(t => t != null);
}
}
public static Type GetTypeByClassName(Assembly assembly, string className)
{
if (assembly == null) throw new ArgumentNullException(nameof(assembly));
return AssemblyHelper.GetLoadableTypes(assembly).Where(a => a.Name == className).FirstOrDefault();
}
}
Type model = AssemblyHelper.GetTypeByClassName(Assembly.GetExecutingAssembly(), MappingColums.Tokens.EF + modelName + MappingColums.Tokens.Repository);
MethodInfo method = model.GetMethods().FirstOrDefault(x => x.Name == MappingColums.Tokens.Get + modelName + MappingColums.Tokens.Validation && x.GetParameters().Count() == 0);
ConstructorInfo constructor = model.GetConstructor(new[] { typeof(AureliaCMSStoreContext) });
object instanceConstructor = constructor.Invoke(new object[] { context });
object instanceMethod = method.Invoke(instanceConstructor, null);