2009-03-15 5 views
0

私は一般的な機能と、次のクラスhiearchyありますジェネリック機能質問C#

protected virtual void LoadFieldDataEditor <T1, T2> (T1 control, T2 objData, string strFieldName) where T1 : Control where T2 : BaseDataType 
{ 
    //I will need to access field1. 
    //I don't know at compile time if this would be SomeType1 or 
//SomeType2 but all of them inherit from BaseDataType. 

    //Is this possible using generics? 
} 

public abstract class BaseDataType {} 

public class SomeType1 : BaseDataType 
{ 
    string field1; 
    string field2; 
} 

public class SomeType2 : BaseDataType 
{ 
    string field3; 
    string field4; 
} 

答えて

1

番号を「フィールド1」がBaseDataTypeで宣言されていない限り、それはSomeType1にキャストせずにアクセスすることはできません。

3

これは、field1を公開する具体的なタイプがある場合にのみ可能です。この場合、すべての基本クラスに実装されている仮想プロパティを指定できるBaseDataTypeがあります。

public abstract class BaseDataType { 
    public abstract string Field1 { get; } 
} 

これは単純です、あなたがSomeType1でプロパティを実装LoadFieldDataEditor

protected virtual void LoadFieldDataEditor <T1, T2> (T1 control, T2 objData, string strFieldName) where T1 : Control where T2 : BaseDataType 
{ 
    string f1 = objData.Field; 
} 

内プロパティにアクセスすることができます。単にプロパティを実装し、基になるフィールドを返します。

public class SomeType1 : BaseDataType { 
    public override string Field1 { get { return field1; } } 
    // Rest of SomeType 
} 

Field1に対してSomeType2が返されるべきですか?これがどのように実装されるべきかという疑問は不明です。

1

いいえ、これは最初は汎用メソッドの適切な使用ではありません。あなたは2つの特定の参照型に両方のタイプを制約している場合は一般的な方法は、あなたのために何もしない

 
protected virtual void LoadFieldDataEditor(Control control, BaseDataType objData, string strFieldName) 
{ 
    SomeType1 type1 = objData as SomeType1; 
    if (type1 != null) 
    { 
     // use type1.field1 here! 
    }

}

:としてちょうどあなたの方法を書き換えます。基本クラスを直接使用することもできます。これは簡単で簡単にでき、理解しやすく、全体的にうまく機能します。