自动化类型转换
本文关键字:类型转换 自动化 | 更新日期: 2023-09-27 18:05:02
我有以下接口:
public interface IDataAccessor
{
IList GetAllRecords();
IFormEditor ShowAddEditForm();
}
和继承此接口的类:
public class LanguageDataAccessor : IDataAccessor
{
public void SaveLanguage(Languages language)
{
LanguagesDAO languages = new LanguagesDAO();
languages.Save(language);
}
// other methods...
}
在用户控制中我有以下代码:
public partial class ucDisplayDictionary : UserControl
{
public Type DictionaryName { get; set; }
public IDataAccessor DataAccessor { get; set; }
public ucDisplayDictionary(IDataAccessor accessor)
: this()
{
DataAccessor = accessor;
DictionaryName = accessor.GetType();
}
private void btnEditRecord_Click(object sender, EventArgs e)
{
if (dgvDisplayDictionary.CurrentRow != null)
{
var frmEdit = DataAccessor.ShowAddEditForm();
frmEdit.SetValue(dgvDisplayDictionary.CurrentRow.DataBoundItem);
if (frmEdit.GetForm().ShowDialog() == DialogResult.OK)
{
dgvDisplayDictionary.DataSource = null;
dgvDisplayDictionary.DataSource = ((LanguageDataAccessor)DataAccessor).Collection; // *
}
}
}
在字符串(*)中,我想这样写:
dgvDisplayDictionary.DataSource = ((DictionaryName)DataAccessor).Collection;
因为这个用户控件对于其他DataAccessor是通用的,
我该怎么做?
如果你所有的IDataAccessor
实现都有Collection
属性,你应该把这个属性放在IDataAccessor
中-然后你根本不需要强制转换。
如果您的Collection
属性是强类型的,您可能需要这样做:
public interface IDataAccessor
{
IList GetAllRecords();
IFormEditor ShowAddEditForm();
IList Collection { get; }
}
public interface IDataAccessor<T> : IDataAccessor
{
new IList<T> Collection { get; }
}
(同理,IEnumerator
具有非泛型的Current
,而泛型的IEnumerator<T>
具有泛型属性)
这样,任何以强类型方式需要集合的东西都可以使用IDataAccessor<T>
,但您不需要使ucDisplayDictionary
类具有泛型。(顺便说一下,我建议您将其重命名以遵循。net惯例-它现在看起来很可怕。)
IDataAccessor.GetAllRecords()
方法已经做了你想要的,当然,你只需要改变你的代码:
dgvDisplayDictionary.DataSource = DataAccessor.GetAllRecords();
(顺便说一下,您不需要首先将DataSource
设置为null)