Решено, я просто был глупым.Я пропустил проблему в моем первом представлении.
Я заканчивал тем, что вложил два типа списка, потому что функция делает 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
}
}
}
}