Что я хочу сделать, это прочитать все, что находится в моей базе данных lex.db. Предпочтительно выгружать страницы с заранее заданным размером. Я сделал следующее:Получить тип программно и использовать его как typeparam
DbInstance database = GetDatabase();
var tables = database.AllTables();
foreach (var table in tables)
{
string str = table.ToString();
str = str.Replace("Lex.Db.DbTable`1[", string.Empty);
str = str.Replace("]", string.Empty);
Type t = Type.GetType(str);
if (t != null)
{
var columns = database.ReadAll<t>();
//handle all columns
}
}
Проблема в том, что функция ReadAll имеет typeparam. Я предположил, что могу использовать этот тип как typeparam, так как он представляет класс, который я хочу получить.
Однако я получаю ошибку:
"The type or namespace name 't' could not be found (are you missing a using directive or an assembly reference?)".
Так как я могу сделать это так, что фактический тип будет использоваться в качестве typeparam вместо буквы «т»?
Я создаю окна универсальное приложение для окон 8.1 и Windows Phone 8,1
EDIT:
Исходя из предположения, что romkyns и Стефан Steinegger дал я попытался с помощью отражения. У меня теперь есть следующий код:
DbInstance database = DbInstance.GetInstance();
System.Type thisType = database.GetType();
TypeInfo thisTypeInfo = thisType.GetTypeInfo();
MethodInfo method = thisTypeInfo.GetDeclaredMethod("LoadAll");
var tables = database.AllTables();
foreach (var table in tables)
{
string str = table.ToString();
str = str.Replace("Lex.Db.DbTable`1[", string.Empty);
str = str.Replace("]", string.Empty);
Type t = Type.GetType(str);
if (t != null)
{
MethodInfo generic = method.MakeGenericMethod(t);
object[] parameters = { this, null };
var columns = generic.Invoke(database, parameters);
if (columns != null)
{
//handle columns
}
}
}
Это работает до такой степени, что вызывается метод вызова. В этот момент возникает следующее исключение:
An exception of type 'System.Reflection.TargetException' occurred in mscorlib.dll but was not handled in user code
Additional information: Object does not match target type.
Любые подсказки о том, как разрешить это?
EDIT II:
методВЫЗОВ должен был называться:
var columns = generic.Invoke(database, null);
Я не думаю, что это возможно, дженерики должны быть известны во время компиляции. Может быть, через какую-то форму отражения? – Barnstokkr