我正在使用SqlDependency来监视数据库中的更改.让我们说,这些是股票报价,以使例子易于理解.该应用程序还使用(另一个)SqlDependeny-Object来监视静态数据的更改,这些更改缓存在应用程序中.
我所做的是,SqlDependency.Start()在启动应用程序时启动依赖关系,并SqlDependeny.Stop在关闭应用程序时调用.到目前为止,一切都运作良好.
现在,当用户选择股票代码时,会设置另一个SqlDependency并通知我有关我可以采取措施的更改.当用户更改他想要跟踪的符号时,我必须设置一个新的SqlDependency,并且必须清除旧的SqlDependency.
我的问题是:这是真的吗?我怎样才能清除特定的依赖关系?SqlDependency.Stop()是一个静态方法,并停止所有依赖 - 甚至在那里我很不确定SQL服务器上的通知订阅是否真的被清除 - 或只是等待进入超时.
如果这是使用SqlDependency进行缓存的正确方法,或者是否有其他好的和简单的实践来实现这一点,这一切都提出了一个问题?
我想知道如何最好地克隆一个对象并将事件订阅者重新附加到新克隆的对象。
背景:我使用转换器,它可以从字符串转换为对象。该对象在转换器的上下文中是已知的,因此我只想获取该对象并复制属性值和事件调用列表:
[TypeConverter(typeof(MyConverter))]
class MyObject
{
public string prop1 { get; set; }
public string prop2 { get; set; }
public delegate void UpdateHandler(MyObject sender);
public event UpdateHandler Updated;
}
class MyConverter(...) : ExpandableObjectConverter
{
public override bool CanConvertFrom(...)
public override object ConvertFrom(...)
{
MyObject Copied = new MyObject();
Copied.prop1 = (value as string);
Copied.prop2 = (value as string);
// For easier understanding, let's assume I have access to the source
// object by using the object named "Original":
Copied.Updated …Run Code Online (Sandbox Code Playgroud) 好的,这是一个艰难的.
简介:我的想法是连接我写了一个实例化的QueryBuilder类,到PropertyGrid中.QueryBuilder类现在包含几个字段,这些字段是硬编码的,如下例所示.因此,允许用户指定,哪些字段应该以何种方式(排序,分组等)的查询使用.在用户为这些属性指定了所有设置后(通过代码或通过PropertyGrid GUI),QueryBuilder能够生成查询.一切都很好.伪代码:
class QueryBuilder {
public QBField name {get; set;}
public QBField prename {get; set;}
public QBField zip {get; set;}
// ...
public void QueryBuilder() {
name = new QBField();
prename = new QBField();
// ...
}
public getQuery() {
// logic to build the query
}
}
class QBField {
public bool shown {get; set;}
public bool sortby {get; set;}
public bool groupby {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
挑战:现在不是硬编码的每个字段作为QueryBuilder的类公共属性,我不知道我怎么会用即List<string>包含所有我的领域"填充"具有这些属性我实例化QueryBuilder的.
所以这导致了三个问题:
难道这由QueryBuilder的类的类型莫名其妙压倒一切的GetProperties()来完成,如果是,它是如何做得最好?
然后我如何在运行时生成QBField属性并在实例化时迭代所有这些?想法:PropertyDescriptors和Activators?
如何迭代所有这些属性来读取每个QBField对象的值?我遇到的问题是,当用反射读取QBField的属性并尝试getValue(obj,null)时,当然需要的第一个参数是一个对象,我不知道,因为我有很多这些QBField对象.也许把我所有的QBField都放进去List<QBField>并迭代它?这会在这个例子中起作用吗?
我只是有点迷失,但我觉得我非常接近解决方案.因此,非常感谢任何帮助或只是指向正确的方向!