GetMethod возвращает ноль C # - PullRequest
       0

GetMethod возвращает ноль C #

0 голосов
/ 19 января 2019

Я не понимаю, почему 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);

1 Ответ

0 голосов
/ 19 января 2019

Ваш код никогда не будет работать.Вам нужен экземпляр вашего объекта для выполнения метода.Что-то вроде:

    Type model = AssemblyHelper.GetTypeByClassName(Assembly.GetExecutingAssembly(), modelName + MappingColums.Tokens.Validation);

    MethodInfo method = model.GetMethod(MappingColums.Tokens.Get + modelName);

    myClass myObject = new myObject();

    object result = method.Invoke(myObject , null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...