MethodInfo.MakeGenericMethod возвращает MethodInfo с неправильным типом - PullRequest
1 голос
/ 02 сентября 2011

Решено, я просто был глупым.Я пропустил проблему в моем первом представлении.

Я заканчивал тем, что вложил два типа списка, потому что функция делает List, и когда я запрашивал универсальный метод с тем же типом повторения, он вкладывает их,Мне нужен способ получить тип каждого элемента в списке.

Оригинальный вопрос:

Когда я пытаюсь построить универсальный метод с помощью отражения, я получаю неправильный тип возврата.

Вот оригинальный метод.

(в пределах DomainRepository)

public List<T> GetAll<T>()
{
    List<T> passedType;
    using (ISession s = Singleton.OpenSession())
    {
        using (ITransaction t = s.BeginTransaction())
        {
            passedType = s.Query<T>().ToList<T>();
            t.Commit();
        }
    }
    return passedType;
}

И вот что я с ним делаю:

(в блокеtest)

MethodInfo mi = typeof(DomainRepository)
                .GetMethod("GetAll")
                .MakeGenericMethod(typeof(Domain.Entity));

dynamic genericResults = mi.Invoke(genericFactory, null);

Когда проходит выполнение mi.Invoke, я получаю

System.Collections.Generic.List<System.Collections.Generic.IList<Domain.Entity>>

, когда считаю, что должен получить

System.Collections.Generic.List<Domain.Entity>

Что я делаю не такздесь?

Что если я захочу сгенерировать универсальный метод и бросить его в динамический тип, подобный этому (который вырос из-за моей неспособности приводить не конкретный тип)?

Для уточнения, вот весь тест:

[Test]
public void TestDataAccess()
{

    var genericAssembly = System.Reflection.Assembly.GetAssembly(typeof(Data.DomainRepository));
    var genericFactory = new Data.DomainRepository();

    var types = from x in System.Reflection.Assembly.GetAssembly(typeof(ActivityFactory)).GetTypes()
                where x.Name.Contains("Factory") 
                select x;

    foreach (Type t in types){
        Console.WriteLine(Environment.NewLine+ t.Name +" : "+ t.BaseType.Name);

        if (t.BaseType.Name != "Object"){
            Console.WriteLine(t.Name + " inherits " + t.BaseType.Name +". Skipping." + Environment.NewLine);
            continue;
        }

        var getSingle_methods = from m in t.GetMethods() 
            where m.GetParameters().Count() == 0
            && m.Name.Contains("get")
            select m;

        object objectInstace = System.Activator.CreateInstance( t );

        foreach (var method in getSingle_methods) {

            if (method.ReturnType.FullName.Contains("Domain")){
                    Console.WriteLine(method.Name + " returns "+method.ReturnType.Name);

                    dynamic resultOfMethod = t.InvokeMember(method.Name, 
                                                        BindingFlags.Public |
                                                        BindingFlags.Instance | 
                                                        BindingFlags.InvokeMethod, null, objectInstace, null);


                    MethodInfo mi = typeof(Data.DomainRepository)
                                    .GetMethod("GetAll")
                                    .MakeGenericMethod(method.ReturnType);


                    dynamic genericResults = mi.Invoke(genericFactory, null);

//unfinished as yet
                }
            }


        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...