J'écris une grande méthode statique qui prend un argument générique en paramètre. J'appelle cette méthode et l'infrastructure génère une exception System.InvalidProgramException. Cette exception est levée avant même que la première ligne de la méthode ne soit exécutée."CLR a détecté un programme non valide." lorsque j'appelle Generic Methods
Je peux créer une classe statique qui prend l'argument générique, puis en faire une méthode de la classe statique, et tout fonctionne bien.
Est-ce un défaut .NET, ou y a-t-il une règle générique obscure que je casse ici? Par souci d'exhaustivité, j'ai inclus la méthode qui échoue, et la méthode qui passe. Notez que cela utilise un certain nombre d'autres classes de ma propre bibliothèque (par exemple GridUtils), et ces classes ne sont pas expliquées ici. Je ne pense pas que le sens réel compte: la question est pourquoi le runtime se bloque avant même que la méthode ne commence.
(je suis la programmation avec Visual Studio 2005, alors peut-être ce qui a disparu dans Visual Studio 2008.)
Cela jette une exception avant la première ligne est invoquée:
private delegate void PROG_Delegate<TGridLine>(DataGridView dgv, IEnumerable<TGridLine> gridLines, string[] columns);
public static void PopulateReadOnlyGrid<TGridLine>(DataGridView dgv, IEnumerable<TGridLine> gridLines, string[] columns)
{
if (dgv.InvokeRequired)
{
dgv.BeginInvoke
(
new PROG_Delegate<TGridLine>(PopulateReadOnlyGrid<TGridLine>),
new object[] { dgv, gridLines, columns }
);
return;
}
GridUtils.StatePreserver statePreserver = new GridUtils.StatePreserver(dgv);
System.Data.DataTable dt = CollectionHelper.ConvertToDataTable<TGridLine>((gridLines));
dgv.DataSource = dt;
dgv.DataMember = "";
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
GridUtils.OrderColumns<TGridLine>(dgv, columns);
statePreserver.RestoreState();
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
}
Cela fonctionne très bien:
public static class Populator<TGridLine>
{
private delegate void PROG_Delegate(DataGridView dgv, IEnumerable<TGridLine> gridLines, string[] columns);
public static void PopulateReadOnlyGrid(DataGridView dgv, IEnumerable<TGridLine> gridLines, string[] columns)
{
if (dgv.InvokeRequired)
{
dgv.BeginInvoke
(
new PROG_Delegate(PopulateReadOnlyGrid),
new object[] { dgv, gridLines, columns }
);
return;
}
GridUtils.StatePreserver statePreserver = new GridUtils.StatePreserver(dgv);
System.Data.DataTable dt = CollectionHelper.ConvertToDataTable<TGridLine>((gridLines));
dgv.DataSource = dt;
dgv.DataMember = "";
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
GridUtils.OrderColumns<TGridLine>(dgv, columns);
statePreserver.RestoreState();
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
}
}
Est-ce pour ASP.NET, WinForms ou quoi? Qu'est-ce que l'espace de noms GridUtils? – GregUzelac
L'espace de noms GridUtils fait partie de ma propre bibliothèque. Je vais préciser que c'est le message, merci. –
En réponse directe à votre question, il se trouve dans WinForms. –