2011-01-16 2 views
3

Ich versuche, eine Schnittstelle zu implementieren, die eine einzelne Eigenschaft erfordert, aber ich interessiere mich nicht explizit für welchen Typ es ist. Zum Beispiel:C#: Implementieren Sie eine Schnittstelle mit einer Eigenschaft eines beliebigen Typs

public interface IName 
{ 
    dynamic Name {get; set;} 
} 

Dann, wenn ich eine Klasse Ich mag würde die Iname Schnittstelle mit einer Art von Zeichenfolge implementieren:

public class Person : IName 
{ 
    public string Name {get; set;} 
} 

Dies wirft jedoch einen Fehler. Ich weiß, ich könnte die Schnittstelle Iname mache ein generisches Argument nehmen IName<T> aber das zwingt mich eine Reihe von überladenen Funktionen zu erstellen, die IName<string> nehmen, IName<NameObj>, IName<etc> stattdessen innerhalb einer einzigen Funktion des Gießens.

Wie kann ich verlangen, dass eine Klasse eine Eigenschaft enthält? Machen

+0

Muss der Rückgabetyp wirklich "irgendein Objekt" sein? Wie wird der konsumierende Code aussehen und wie wird er mit einem * beliebigen * Objekt, das zurückgegeben wird, umgehen? Die einzigen Dinge, die Sie wirklich wissen werden, sind Methoden auf "Object", und wenn Sie diese verwenden möchten, können Sie auch den Rückgabetyp "Object" verwenden. Ich denke, wenn das ein Wegwerf- oder interner Code ist, den Sie nur sehr wenig wiederverwenden wollen, dann ist es vielleicht in Ordnung. Darüber hinaus schlage ich vor, das Typsystem zu nutzen. –

Antwort

5

Ich kann das jetzt nicht testen, aber vielleicht könnten Sie die Schnittstelle explizit implementieren.

public class Person : IName 
{ 
    public string Name {get; set;} 

    dynamic IName.Name { 
     get { return this.Name; } 
     set { this.Name = value as string; } 
    } 
} 
+1

Gut gespielt. Das funktioniert völlig. Niemals würde man darüber nachdenken. – James

9
interface IName<T> 
{ 
    T Name { get; set; } 
} 

class Person : IName<string> 
{ 
    public string Name { get; set; } 
} 
+1

Der beste Weg, dies zu tun. Dynamik sollte am besten vermieden werden, es sei denn, Sie sind absolut sicher, was Sie tun. Und in vielen Fällen bist du es nicht. – Euphoric

0

public string Name {get; set;} 

und den Rückgabetyp Objekt machen.

+0

Nein: ''Person' implementiert nicht das Interface-Mitglied 'IName.Name'. 'Person.Name' kann 'IName.Name' nicht implementieren, da es nicht den passenden Rückgabetyp von 'dynamic' hat. Mein Code in der Frage war jedoch falsch. Guter Fang und aktualisiert. – James

1

Die Rückgabe einer dynamischen Datei ermöglicht die Rückgabe eines beliebigen Typs. Deklarieren Sie den Typ in Ihrer implementierenden Klasse einfach als dynamisch.

public interface IName 
    { 
     dynamic name { get; set; } 
    } 

    public class Person: IName 
    { 
     private string _name; 
     public dynamic name { get { return _name; } set { _name = value;} } 
    } 

edit:

beachten Sie, dass Sie vorsichtig sein müssen werde, was Sie der Typ Wert zu benennen passieren, da nur zur Laufzeit überprüft werden (die Freuden der Verwendung dynamischer Typen).

Verwandte Themen