2017-07-21 14 views
0

私は、データベース内のテーブルからリストを取得しています:C#ジェネリックリスト

var dependency = (from ctf in dc.Fields 
        join ctfd in dc.FieldsDependencies on ctf.id equals ctfd.Fieldid_depend 
        where ctf.ctid == ctid && ctf.fieldname == fieldname 
        select ctfd).ToList(); 

私は別の関数にパラメータとしてこのリストを渡しています:

public void DoYesDeleteDepField<T>(string fieldname, List<T> dep) 

どのように私ができますidフィールドを取得できるように変更しますか?

しかし、私はリストを反復できず、depsingle.idフィールドを取得します。 IHasId またはクラスレベル

+2

なぜ機能は、一般的なのですか?そのため、特定のタイプのフィールドにはアクセスできません。 Tは一般的なもので、特定のタイプの特定のフィールドにアクセスしようとしています。 – user3185569

+0

あなたは 'var desingleid = depsingle.id'を意味しましたか? – MotKohn

+1

さて、 'T'は' id'か何かについて知りません。それがエラーになるのです。タイプに汎用制約を追加して、ベースクラスから継承するタイプのみを許可するか、インターフェースを実装する必要があります。また、1つのタイプにのみ興味がある場合は、ジェネリックを省略することもできます。 – HimBromBeere

答えて

0

..ます。public void ...キャスト(var a = (int)something or var a = something as intのように)するか、List<t>から汎用性の低いものに書き込んでください。例えばList<classname>Tとして

+0

C#プログラミングガイドのリンク:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters –

0

でそれを定義することが<T>はとてもパラメータを.IDたことを知らない:Tは

あなたがTであるかを定義する必要があります
foreach (var depsingle in dep) 
     { var depsingleid = depsingle.id //ERROR 
..... 
0

にはメンバーがすべてのこれらのタイプにid呼ばないintMyClassへthere'sから何でもすることができます。したがって、あなたはタイプがTのために可能であるかをコンパイラに指示し、一般的な制約、例えば必要があります。

public void DoYesDeleteDepField<T>(string fieldname, List<T> dep) where T: MyClass 

または完全にジェネリックを省略するように一つだけのタイプは、用語ジェネリックはかなり無駄にすることも可能です。

class MyClass 
{ 
    public string Id { get; set; } 
    // further properties 
} 

今すぐあなたのクエリからそれらのオブジェクトのインスタンスを作成します:単にあなたの参加とあなたの方法にこれを渡すからの値がhildsクラスを定義

var result = (from ctf in dc.Fields 
       join ctfd in dc.FieldsDependencies on ctf.id equals ctfd.Fieldid_depend 
       where ctf.ctid == ctid && ctf.fieldname == fieldname 
       select new MyClass 
       { 
        id = ctf.id, 
        // further properties 
       }).ToList(); 

public void DoYesDeleteDepField(string fieldname, List<MyClass> dep) 
関連する問題