J'ai cette méthode Verify_X qui est appelée pendant le databind pour une valeur sélectionnée dans la liste. Le problème est la source de données fortement typée. Je veux utiliser la classe abstraite BaseDataSource ou une interface pour appeler les méthodes supportées: Paramètres [] et Select(), Au lieu d'utiliser l'implémentation la plus spécifique comme vu ci-dessous.Coulée vers une classe ou une interface abstraite lorsque des génériques sont utilisés
Ceci est donc une méthode peut être utilisée pour tous les différents types de sources de données que j'ai au lieu d'avoir une méthode pour chacun. Ils héritent tous de la même manière.
Voici la chaîne d'héritage/mise en œuvre
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()
Le BaseDataSource a les méthodes et les propriétés dont j'ai besoin. DseDataSource est mis en œuvre de la manière suivante:
public class DseDataSource : ProviderDataSource<SCCS.BLL.Dse, DseKey>
Je sais qu'il est possible de modifier la DseDataSource de classe, ajoutez une interface pour accéder aux paramètres [] et sélectionnez(), puis programme contre ce qui permet ce que je veux, mais cela nécessite d'éditer les bibliothèques NetTiers et je suis curieux de voir si cela peut être fait, car cela semblait si difficile.
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;
}
Le résultat final serait un code tel que:
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;
}
Non, il n'utilise pas une classe partielle mais oui ce serait une bonne façon de créer l'interface. Je pourrais éditer le modèle de NetTiers pour le rendre partiel ou faire l'interface là. Mais je voyais si le casting pouvait être fait avec ce qui est là. – CRice
Il est difficile de répondre à la question de la distribution car il n'est tout simplement pas clair (à partir de l'exemple) ce que vous essayez de lancer, à quoi, où. Pouvez-vous résumer le problème réel du tout? –
Ok merci, s'il vous plaît voir le bas du message que je viens de l'éditer. – CRice