J'ai une interface simple, IDevice
public interface IDevice{
string Id{ get; }
}
J'ai une liste d'objets qui implémentent IDevice
List<IDevice> devices;
Voici un exemple de deux des types d'objets de cette liste:
public class BatteryDevice : IDevice{
public string Id{ get; private set; }
public int StateOfCharge{ get; set; }
}
public class GridDevice : IDevice{
public string Id{ get; private set; }
public decimal Voltage{ get; set; }
}
Je souhaite autoriser l'utilisateur à définir une condition dans le texte à l'aide d'une requête SQL comme celle-ci:
Id = 'Battery1' AND StateOfCharge > 95
Pour que je puisse lire ces conditions à partir d'un fichier de configuration de texte et les comparer à la liste des appareils utilisant LINQ dynamique comme ceci:
var matches = devices.Where("Id = 'Battery1' AND StateOfCharge > 95");
Cela ne fonctionne pas car (bien sûr) le LINQ échouerait en essayant d'obtenir une valeur pour StateOfCharge
du GridDevice
Je me sens un peu comme un n00b et je cherche un moyen d'atteindre mon objectif et j'apprécierais toute contribution.
Tu peux écrire:
var matches = devices
.OfType<BatteryDevice>()
.Where(device => device.Id == "Battery1" && device.StateOfCharge > 95)
.ToList();
Il sélectionne tous les périphériques dans la List
d' IDevice
de type BatteryDevice
ayant la condition désirée correspondante et renvoie une List<BatteryDevice>
éléments de la séquence de requête Linq résultante.
Vous pouvez utiliser ToList
ou non selon ce que vous prévoyez de faire avec le résultat.
Sinon, le résultat est le type de IEnumerable<BatteryDevice>
.
Pour avoir une List
d' IDevice
vous pouvez utiliser:
.ToList<IDevice>();
Ou vous pouvez écrire:
var matches = (IEnumerable<IDevice>)devices...
Sans Linq
var matches = new List<IDevice>();
foreach ( var device in devices )
if ( device is BatteryDevice )
{
var battery = (BatteryDevice)device;
if ( battery.Id == "Battery1" && battery.StateOfCharge > 95 )
matches.Add(battery);
}