2016-04-03 12 views
0

私は関数を呼び出すコードをいくつか持っています。この関数はジェネリックを使用し、バインディングリストに新しい項目を追加する必要があります。GenericsとBinding Listで新しい項目とプロパティを追加する

わかりやすくするために、私は何をしようとしているかを示すコードを削除しました。するBindingListに項目を追加するための

通話機能がbookToc(クラスBookTocのタイプ)と呼ばれる:

private CallingFunction() 
{ 
    AddFunction(bookToc, typeof(BookToc).GetProperty(nameof(BookToc.BookTocItem))) 
} 

機能は、ジェネリックを使用してするBindingListに新しい項目を追加する必要があります。ここで私はコードが何をしたいかである(しかし、それは動作しません):

public AddFunction<T>(BindingList<T> bindingList, PropertyInfo propertyName) 
{ 
    string theItem = "Hello"; 
    string theTitle = "World"; 

    //this does not work because the generic list does not know the properties available: 
    bindingList.Add(new BindingList 
    { 
     BookTocItem = theItem, 
     BookTocTitle = theTitle 
    }); 
} 

私はジェネリックを使用しておりますので、私は新しい項目を追加して、特定のプロパティを設定するように見えることはできません。私はそれが一般的であり、したがって利用可能なプロパティを知らないので、これが当てはまる理由は確かです。

バインディングリストに新しい行を追加し、ジェネリックを使用して特定のプロパティを設定する必要があります。これは可能ですか?もしそうなら、私はコードサンプルを高く評価します。

+0

しかし、どの値をBindingListに追加された新しい要素のプロパティに設定しますか? AddFunctionが新しい要素をBindingListに追加することができると思われる場合は、新しい要素に設定する各プロパティの値も渡す必要があります。 – Steve

+0

この単純な例よりもはるかに複雑なので、ここでは私のソリューションのすべてのコードを配置しませんでした。 AddFunctionの場合は、bookTocという名前のBindingLIstに新しい行を追加し、BookTocItemプロパティとBookTocTitleプロパティに値を配置できるようにします。 AddFunctionは値を定義するため、値をAddFunctionに渡すことはできません。 – Bill

+0

'propertyName'で何をするつもりですか?呼び出し元がそのプロパティ自体を設定できないのはなぜですか? 'AddFunction'はあまりにも多くのことをしているようです - それはどちらもファクトリメソッドであり、与えられたコレクションにアイテムを追加します。なぜ、呼び出し側に追加する( 'bookToc.Add(CreateFunction(...));)?特定の*プロパティを扱う必要があることを前提として、* generics *の使用はここでは便利ですか? –

答えて

1

Tに使用できるプロパティをコンパイラに指示する型定義を関数定義に追加します。以下のwhere節に注意してください。

public Interface IBindingListItem { 
    string BookTocItem {get; set;} 
    string BookTocTitle {get; set} 
} 

public AddFunction<T>(BindingList<T> bindingList, PropertyInfo propertyName) where T: IBindingListItem, new() 
{ 
    string theItem = "Hello"; 
    string theTitle = "World"; 

    //this does not work because the generic list does not know the properties available: 
    bindingList.Add(new T 
    { 
     BookTocItem = theItem, 
     BookTocTitle = theLinkGuid 
    }); 
    } 
+0

私は 'T'に' new() '制約を加え、' new BindingListItem'を 'new T'に置き換えます。 –

+0

BindlingListItemは単なる例です。 Tの実行時の型がデフォルトコンストラクタ –

+0

を持つという保証がないので、Howerver new T()が機能しないかもしれません。これは 'new()'制約のためです。 –

関連する問題