Ich habe diese Methode Verify_X, die während Databind für eine Listbox ausgewählten Wert aufgerufen wird. Das Problem ist die stark typisierte Datenquelle. Ich möchte die abstrakte Klasse BaseDataSource oder eine Schnittstelle verwenden, um die unterstützten Methoden aufzurufen: Parameter[] und Select(), anstatt die spezifischste Implementierung zu verwenden, wie unten zu sehen.
So kann eine Methode für alle verschiedenen Arten von Datenquellen verwendet werden, anstatt für jede eine eigene Methode zu haben. Sie erben alle auf die gleiche Weise.
Hier ist die Kette der Vererbung / Implementierung
public class DseDataSource : ProviderDataSource<SCCS.BLL.Dse, DseKey>
public abstract class ProviderDataSource<Entity, EntityKey> : BaseDataSource<Entity, EntityKey>, ILinkedDataSource, IListDataSource
where Entity : SCCS.BLL.IEntityId<EntityKey>, new()
where EntityKey : SCCS.BLL.IEntityKey, new()
public abstract class BaseDataSource<Entity, EntityKey> : DataSourceControl, IListDataSource, IDataSourceEvents
where Entity : new()
where EntityKey : new()
Die BaseDataSource hat die Methoden und Eigenschaften, die ich brauche. DseDataSource ist auf folgende Weise implementiert:
public class DseDataSource : ProviderDataSource<SCCS.BLL.Dse, DseKey>
Ich weiß, dass es möglich ist, die Klasse DseDataSource zu bearbeiten, eine Schnittstelle hinzuzufügen, um auf Parameter[] und Select() zuzugreifen, und dann gegen diese zu programmieren, was erlaubt, was ich möchte, aber dies erfordert die Bearbeitung der NetTiers-Bibliotheken, und ich bin neugierig zu sehen, ob dies getan werden kann, da es so schwierig schien.
public static string Verify_DSE(string valueToBind, DseDataSource dataSource)
{
if (ListContainsValue(dataSource.GetEntityList(), valueToBind)) return valueToBind;
CustomParameter p = dataSource.Parameters["WhereClause"] as CustomParameter;
if (p != null)
{
p.Value = "IsActive=true OR Id=" + valueToBind;
dataSource.Select();
return valueToBind;
}
return string.Empty;
}
private static bool ListContainsValue(IEnumerable list, string value)
{
if (value.Length == 0) return true;
foreach (object o in list)
{
IEntity entity = o as IEntity;
if (entity != null)
{
if (entity.Id.ToString() == value)
return true;
}
}
return false;
}
Das Endergebnis wäre ein Code wie der folgende:
public static string Verify(string valueToBind, object dataSource)
{
//what is the correct way to convert from object
BaseDataSource baseInstance = dataSource as BaseDataSource;
if baseInstance != null)
{
if (ListContainsValue(baseInstance.GetEntityList(), valueToBind)) return valueToBind;
CustomParameter p = baseInstance.Parameters["WhereClause"] as CustomParameter;
if (p != null)
{
p.Value = "IsActive=true OR Id=" + valueToBind;
baseInstance.Select();
return valueToBind;
}
}
return string.Empty;
}