2016-04-07 9 views
0

Wie kann ich den folgenden Code generisch machen, so dass ich am Ende eine einzige einfache Funktion anstelle von mehreren Funktionen in einer Reihe von Klassen bekommen kann?Wie wird diese C# -Methode generisch?

Die Aufrufe von FindObject und CreateObject sind Teil einer 3rd-Party-Bibliothek, also habe ich keine Kontrolle über die Parameter zu denen und es ist hier, dass ich stecken bleibe.

private MyClass1 FindClass1Object(string code) 
{ 
    MyClass1 myObject = FindObject<MyClass1>(code); 

    if (myObject == null) 
    { 
    myObject = CreateObject<MyClass1>(); 
    myObject.Code = code; 
    } 

    return myObject; 
} 

private MyClass2 FindClass2Object(string code) 
{ 
    MyClass2 myObject = FindObject<MyClass2 >(code); 

    if (myObject == null) 
    { 
    myObject = CreateObject<MyClass2 >(); 
    myObject.Code = code; 
    } 

    return myObject; 
} 

Ich weiß, dass ich in einem zusätzlichen Parameter übergeben kann einen Typ angeben, die ich suche/erstellen, aber dann wird der Code auf die Anrufe und Findobject Create stecken.

private object ReadClassFromXml (string code, Type myType) 
{ 
    object myObject = FindObject<myType>(code); 

    if (myObject == null) 
    { 
    myObject = CreateObject<myType>(); 
    myType.GetProperty("Code").SetValue(myObject, code, null); 
    } 

    return myObject; 
} 

Antwort

6

Um eine Methode zu machen generic Sie generische Typdefinition (<myType>), und Sie brauchen nicht auf den zweiten Parameter zu verwenden, den Typen angibt (d. Type myType ist nicht erforderlich) hinzufügen müssen. Sie sollten auch den generischen Typ zurückgeben, nicht object. Ich würde auch myType zu T umbenennen, wie es üblich ist, allgemeine Parameter mit Namen zu benennen, die mit T beginnen. Also insgesamt würde Ihr Code wie folgt aussehen:

// Method has generic parameter <T> and returns result of type T: 
private T ReadClassFromXml<T>(string code) 
{ 
    object myObject = FindObject<T>(code); 

    if (myObject == null) 
    { 
    myObject = CreateObject<T>(); 
    myType.GetProperty("Code").SetValue(myObject, code, null); 
    } 

    return myObject; 
} 

Denken Sie daran, dass die generische Methode könnte einige constraints on type parameters erfordern.

+0

Wenn Sie vorgeschlagen haben, Reflection zu verwenden, um diese Methode aufzurufen, vorausgesetzt, Sie haben eine 'Type myType'-Variable, dann wäre dies eine goldene Antwort. – Enigmativity

-1

Sie können es einfach mit Generic einpacken. Einfach wie diese:

private T FindObject<T>(string code) 
{ 
    T myObject = FindObject<T>(code); 

    if (myObject == null) 
    { 
    myObject = CreateObject<T>(); 
    myObject.Code = code; 
    } 

    return myObject; 
} 

Sie haben zu Findobject und Create zu implementieren.

+0

In Ihrem Beispiel wird myObject.Code eine Ausnahme für die Kompilierungszeit "Member nicht gefunden" auslösen. – Brook

+3

Sie werden dort in Vergessenheit geraten – Jonesopolis

+0

Es ist wirklich ziemlich klar in der Frage, dass 'FindObject ' bereits existiert. – Enigmativity