У меня есть этот метод Verify_X, который вызывается во время привязки данных для выбранного в списке значения. Проблема заключается в строго типизированном источнике данных. Я хочу использовать абстрактный класс BaseDataSource или интерфейс для вызова поддерживаемых методов:
Параметры [] и Select (), вместо использования наиболее конкретной реализации, как показано ниже.
Это так, что один метод можно использовать для всех различных типов источников данных, которые у меня есть, вместо того, чтобы иметь метод для каждого. Все они наследуют одинаково.
Вот цепочка наследования / реализации
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()
BaseDataSource содержит методы и свойства, которые мне нужны. DseDataSource реализован следующим образом:
public class DseDataSource : ProviderDataSource<SCCS.BLL.Dse, DseKey>
Я знаю, что можно отредактировать класс DseDataSource, добавить интерфейс для доступа к параметрам [] и Select (), а затем запрограммировать его, что позволяет то, что я хочу, но это требует редактирования библиотек NetTiers, и мне любопытно посмотрим, можно ли это сделать, потому что это казалось таким трудным.
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;
}
Конечным результатом будет код, такой как:
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;
}