2011-11-11 43 views
0

我不得不修改大量代码来为一堆表适配器设置SqlCe数据库连接。我想避免重复,并尽量减少错过更新表适配器的机会,方法是创建一个通用方法来包装每个表适配器的创建。不幸的是,表格适配器不是从单个基类派生的,并且每个都有它自己的连接属性。通过分配新的表格适配器到动态我可以得到它编译。这是一个很好的方法,并且在使用dynamic时应该注意哪些陷阱?在动态接口中未定义泛型类型的访问属性

protected void TableAdapter<T>(Action<T> action) where T : IDisposable, new() 
{ 
    using (var connection = new SqlCeConnection(ConnectionString)) 
    using (dynamic tableAdapter = new T()) 
    { 
     tableAdapter.Connection = connection; 
     action(tableAdapter); 
    } 
} 

回答

1

不,没有陷阱。我认为你正在交换编译器检查以提高可读性。如果有其他人使用它,那么运行时错误将很明显,Connection成员不在那里。

就我个人而言,我还会将转换添加到动作的参数中,因为动态调用不需要。但我认为这是一个可选择的选择,因为性能增益可能可以忽略不计,无论哪种方式,它的工作方式都是一样的,我的人员风格是将动态使用的范围限制在有目的的范围内。

protected void TableAdapter<T>(Action<T> action) where T : IDisposable, new() 
{ 
    using (var connection = new SqlCeConnection(ConnectionString)) 
    using (dynamic tableAdapter = new T()) 
    { 
     tableAdapter.Connection = connection; 
     action((T)tableAdapter); 
    } 
} 
1

这可以工作,但对C#来说有点不正统。这里是一个替代方案,牺牲编译时的安全性有点干的:

protected void TableAdapter<T>(Action<T, SqlCeConnection> action) where T : IDisposable, new() 
{ 
    using (var connection = new SqlCeConnection(ConnectionString)) 
    using (var tableAdapter = new T()) 
    { 
     action(tableAdapter, connection); 
    } 
} 

现在,你的行动将需要设置除了它任何其他的连接,但编译器验证的访问而你不知道没有动态包装的性能损失。

+0

感谢丹,是的,我已经考虑过这种方法,但我想我更可能忘记在操作中设置连接而不是调用TableAdapter而不是表格适配器。 –