2011-08-08 10 views
0

Iは、以下のインターフェースを有する:で自動鋳造タイプ

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; // *       
       } 
      }  
     } 

:私は、次のコードを有するユーザ制御で

public class LanguageDataAccessor : IDataAccessor 
    { 

     public void SaveLanguage(Languages language) 
     { 
      LanguagesDAO languages = new LanguagesDAO(); 
      languages.Save(language); 
     } 
    // other methods... 
} 

:このインタフェースを継承

public interface IDataAccessor 
    { 
     IList GetAllRecords(); 
     IFormEditor ShowAddEditForm(); 


    } 

とクラス文字列(*)そのようなものを書きたい:

dgvDisplayDictionary.DataSource = ((DictionaryName)DataAccessor).Collection; 

このユーザーコントロールは、他のDataAccessorのために一般的ですので、

私はこれをどのように行うことができますか?
ありがとう、私の英語のために申し訳ありません。

+0

なぜあなたはちょうどIDataAcccessorにコレクションを追加しないと、すべての鋳造を避けますか? –

答えて

1

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に設定する必要はありません。)

+0

お返事ありがとうございます。 – user348173