我有这个方法 Verify_X,它在数据绑定期间为列表框选定值调用。问题是强类型数据源。我想使用抽象类 BaseDataSource 或接口来调用支持的方法:Parameters[] 和 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 类,添加一个接口来访问 Parameters[] 和 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;
}