2011-08-05 10 views
2

2つの型を受け入れるジェネリックメソッドを作成できますか? attributeTypets_attributeTypeは、同じフィールドを持ちますが、共通の親クラスを共有しません。C#で2つの異なる型を受け入れる汎用メソッドを作成できます

これは可能ですか?または、私はこれを達成するための何らかの方法がありますか?

private static void FieldWriter<T>(T row) 
     where T : attributeType, ts_attributeType 

    { 
     Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/"); 
    } 

私はそれはまた、私の質問に適用される場合が、私は確かではないよ、このanswer from Jon Skeetを見てきました。

さらに背景: attributeTypets_attributeTypeの両方がxsd.exeツールを使用して作成されています。部分クラスです。

+1

は、あなたがそれらを作ることができますどちらも共有インターフェイスを実装していますか? –

答えて

5

いいえ、できません。最も簡単な方法は、各タイプごとに1つずつ、2つのオーバーロードを記述することです。あなたはあまり自分を繰り返さないようにしたい場合は、いつでも共通のコードを抽出することができます。

また
private static void FieldWriter(attributeType row) 
{ 
    FieldWriterImpl(row.id, row.type); 
} 

private static void FieldWriter(ts_attributeType row) 
{ 
    FieldWriterImpl(row.id, row.type); 
} 

// Adjust parameter types appropriately 
private static void FieldWriterImpl(int id, string type) 
{ 
    Console.Write(id + "/" + (type ?? "NULL") + "/"); 
} 

、あなたがC#4

(よりよい解決策は、希望を使用している場合動的型付けを使用することができます可能であれば2つのクラスに共通のインターフェイスを与え、同時に.NETの名前付け規則に従うように名前を変更してください:)

EDIT:部分クラスを使用することができたので、まったく一般的である必要がありません。

private static void FieldWriter(IAttributeRow row) 
{ 
    Console.Write(row.id + "/" + (row.type ?? "NULL") + "/"); 
} 
+0

Jonさん、ありがとうございます。私の現在の解決策は正しいですか? – Ahmad

+0

@Ahmad:はい、部分的なクラスを使用して共通のインターフェースを実装するのは良い解決策ですが、私は他の場所で使っています。私はそれを 'ICommonFields'と呼んでいませんが、* fields * :)を指定していないので、それも一般的である必要はありません - 私の答えを編集します。 –

+0

私は私の元の解決策でそれを逃した。ジェネリック制約を持つ必要はありませんでした。ありがとう – Ahmad

1

私の現在の解決策は、インターフェイスを作成し、部分クラスに実装させることです。ロジックのやや後方。

namespace Test 
{ 
    public partial class attributeType: IAttributeRow {} 

    public partial class ts_attributeType : IAttributeRow {} 

    public interface ICommonFields 
    { 
     string id { get; set; } 
     string type { get; set; } 
    } 
} 


    private static void FieldInfo<T>(T row) 
     where T : IAttributeRow 

    { 
     Console.Write(((T)row).id + "/" + (((T)row).type ?? "NULL") + "/"); 
    } 
1

これらが部分的なクラスで、両方が同じプロパティを持つ場合、これらのプロパティをインターフェイスに抽出し、それをジェネリック制約として使用できます。

public interface IAttributeType 
{ 
    int id{get;} 
    string type{get;set;} 
} 

その後、あなたの2クラスに一致する部分クラスを作成し、簡単にインターフェイスを実装:

public partial class AttributeType : IAttributeType 
{ 
    // no need to do anything here, as long as AttributeType has id and type 
} 
public partial class ts_AttributeType : IAttributeType 
{ 
    // no need to do anything here, as long as ts_AttributeType has idand type 
} 

今、あなたは、インターフェイスでジェネリックを制約することができます。

private static void FieldWriter<T>(T row) 
    where T : IAttributeType 

{ 
    Console.Write(row.id + "/" + (row.type ?? "NULL") + "/"); 
} 
+0

linq2sqlで生成されたクラスを扱うときに、同じテーブルデータをすべて返すときに特に便利です。実際の方法では共通の基底クラスを与えることはできません。 –

関連する問題