2011-01-13 21 views
1

Ich bin auf der Suche nach einer Implementierung ähnlich dem Typ 'ID' in Ziel c, die während der Laufzeit von jedem Typ sein kann. Ist es möglich, das in C# zu tun?Deklarieren eines Objekts, das von jedem Typ sein kann C#

lassen Sie mich erklären meine Anforderung

id abc;// a common type which can hold any object during runtime 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
abc = opt1; 
} 
else if(cond2) 
{ 
Option2 opt2 = new Option2(); 
abc = opt2; 
} 
... 

Wie kann ich das gleiche tun in C#? Danke, Nikil.

+0

Ich möchte ein Beispiel zu BoltClocks Antwort hinzufügen. Seine Antwort ist absolut richtig. Sie können das var-Schlüsselwort überall verwenden, wie var myDate = new DateTime(); var myBuilder = new StringBuilder(); ... –

+0

@Serkan Hekimoglu: Sie können das tun, aber Sie können 'var myVar;' nicht deklarieren, es muss bei der Deklaration initialisiert werden. Ich habe 'var' mit' object' verwechselt. – BoltClock

+0

@BoltClock :) du verwirrst mich auch –

Antwort

7

Sie können dies auf zwei Arten tun:

Zuerst Sie den Typ als object erklären können. Dadurch können Sie dem Typ alles zuweisen. Beachten Sie jedoch, dass wenn Sie der Objektreferenz einen Werttyp zuweisen, dieser in einem Rahmen angezeigt wird.

Zum Beispiel:

object abc; 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
// Assignment works, but you can't call a method or prop. defined on Option1 
abc = opt1; 
} // ... 

Die zweite Option, die C# 4 erfordert, ist es als dynamic zu erklären. Dadurch können Sie Methoden und Eigenschaften für das Objekt tatsächlich aufrufen, als wäre es der "echte" Typ. Der Methodenaufruf wird zur Laufzeit fehlschlagen, wenn er nicht existiert, aber zum Zeitpunkt der Kompilierung erfolgreich ist.

Zum Beispiel:

dynamic abc; 
if(cond1) 
{ 
Option1 opt1 = new Option1();//opt1 is an object of user defined class Option1 
// Assignment works 
abc = opt1; 

// This will work if Option1 has a method Option1Method()! 
// If not, it will raise an exception at run time... 
abc.Option1Method(); 
} // ... 
+0

Vielen Dank. "Dynamisch" ist genau das, wonach ich suche. leider habe ich VS 2010 nicht. – Nikil

+0

@Nikil: Sie können die Express-Ausgabe (für freies) hier erhalten: http://www.microsoft.com/express/Downloads/ –

0

Deklarieren Sie eine object oder verwenden Sie das dynamic Stichwort wie andere sagen, oder wenn Sie eine Schnittstelle oder Basisklasse wissen, dass alle Ihre möglichen Objekte aus ableiten, verwenden Sie diese Art:

IOption abc; 
+0

var abc; // nein, das funktioniert nicht – gsharp

+0

@gsharp: Bah, ich vermischte 'var' und' object'. +1 an Sie – BoltClock

4
object abc; // :-) 

oder es ist zu einfach?

1

Sie haben mehrere Möglichkeiten zu prüfen und var ist nicht einer von ihnen.

1) Machen Sie alle Sie-Option-Klassen von einer abstrakten Basisklasse erben.

2) Machen Sie alle Ihre Option-Klassen von einer Schnittstelle erben.

3) Verwenden Sie object als Typ

4) Verwenden Sie ein dynamic Objekt

Es hängt davon ab, was Sie wollen mit 'abc' nach diesem Punkt in dem Code zu tun.

3

dynamische Typen sind genau für diesen Zweck. Ihr "Typ" ist dynamisch (was offensichtlich zur Laufzeit bedeutet).

Ich weiß nicht objektive-C aber es scheint wie ID = dynamisch.

Im Wesentlichen wird ein dynamischer Typ als "typloses" Objekt behandelt. Zur Kompilierungszeit wird keine Intellisense- und Typprüfung durchgeführt.

Verwandte Themen