2009-03-15 1 views
0

Ich habe eine generische Funktion und die folgende Klasse hiearchy:Allgemein Funktion Frage 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; 
} 

Antwort

1

No. Es sei denn, „Feld1“ auf BaseDataType deklariert wird, wird es nicht zugänglich sein, ohne zu SomeType1 zu Gießen.

3

Dies ist nur möglich, wenn Sie einen konkreten Typ haben, der field1 freilegt. In diesem Fall haben Sie BaseDataType, der eine virtuelle Eigenschaft zugewiesen werden kann, die in allen Basisklassen implementiert ist.

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

Auf diese Weise können Sie die Eigenschaft innerhalb LoadFieldDataEditor

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

Implementierung der Eigenschaft zuzugreifen geradlinig. Implementieren Sie einfach die Eigenschaft und geben Sie das zugrunde liegende Feld zurück.

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

Die Frage ist aber, was sollte SomeType2 für Field1 zurückgeben? Bei Ihrer Frage ist unklar, wie dies umgesetzt werden soll.

1

Nein, aber das ist nicht wirklich eine angemessene Verwendung von generischen Methoden an erster Stelle. neu schreiben Sie einfach Ihre Methode als:

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

}

Allgemeine Methoden nichts für Sie tun, wenn Sie beide Typen auf zwei spezielle Referenztypen sind einzuschränken. Sie können die Basisklasse einfach direkt verwenden - sie ist einfacher, einfacher aufzurufen, verständlicher und funktioniert insgesamt besser.