自动化类型转换

本文关键字:类型转换 自动化 | 更新日期: 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)