2009-08-25 8 views
0

Ich versuche derzeit, den Typ zu erhalten, der ein Objekt wie in einem späteren Teil meiner Anwendung gegossen wurde. Dies ist in erster Linie für eine verrückte Situation, die kam, die viel sauberer wäre, wenn ich dies zur Arbeit bringen könnte. Ich schrieb den folgenden Komponententest, der hoffentlich erklärt, was ich hoffe, dass ich arbeite.Getting A Type

using System; 
using NUnit.Framework; 
using NUnit.Framework.SyntaxHelpers; 

namespace Test.Helper 
{ 
    [TestFixture] 
    public class CastingTests 
    { 
     public interface IStub { } 
     public class Stub : IStub { } 

     protected static Type GetCast(object sample) 
     { 
      //TODO work on getting method to return casted type 
      throw new NotImplementedException(); 
     } 

     [Test] 
     public void GettingCastReturnsCastedType() 
     { 
      IStub stub = new Stub(); 
      Type type = GetCast(stub); 
      Assert.That(type, Is.EqualTo(typeof(IStub))); 
     } 
    } 
} 

So ziemlich muss ich einen Weg finden, um den ISTub-Typ aus dem Beispielobjekt dynamisch zu bekommen. In der Anwendung könnte es sein, was auch immer das Objekt wurde gegossen, als wenn es übergeben wurde. Ich habe keine Ahnung, ob das überhaupt möglich ist, aber wäre es ziemlich cool, wenn es ist. Danke im Vorraus für deine Hilfe!

+1

Warum möchten Sie überprüfen, ob 'Stub' 'ISTub' implementiert, wenn Sie' Stub' bereits deklarieren, um 'ISTub' zu implementieren? – dtb

+0

Wie nennt man hier "Gusstyp"? Bitte sei expliziter ... –

+1

Es klingt, als ob du ein Yak rasierst ... (http://theagileadvisors.com/the-agile-team/so-there-i-am-shaving-a-yak/) – grenade

Antwort

5

ein Objekt Casting nicht über irgendwelche tatsächlichen Effekte auf dieses Objekt, mit der möglichen Ausnahme, wenn diese Klasse eine explizite Umwandlung definieren würde, die eine Operation auf dem ursprünglichen Wert ausgeführt hat, die eine Nebenwirkung erzeugte ... eine wirklich obskure und nicht intuitive Situation.

Wie für eine allgemeine Lösung, nein, gibt es keine Möglichkeit zu bestimmen, was es "vor" war, weil es immer noch das gleiche Objekt ist, nur aus der Perspektive des Codes als ein anderer Typ betrachtet. Die Instanz selbst ist dieselbe.

+0

Macht Sinn, wahrscheinlich muss ich sowohl das Objekt als auch den Typ an die Methoden übergeben, die ich dann verwenden werde. – basicdays

1

Ich kann nicht 100% sicher sein, aber ich glaube, Sie wären in der Lage, etwas in dieser Richtung zu tun:

protected static Type GetCast<T>(T obj) 
{ 
    return typeof(T); // NOT obj.GetType(); 
} 

und dann:

public void GettingCastReturnsCastedType() 
{ 
    IStub stub = new Stub(); // casted as an IStub 
    Type type = GetCast(stub); // see what this returns 
} 
+0

Ich würde Generika verwenden, aber die Position, an der ich dies tatsächlich tun möchte, hat einen Methodenparameter von (params object [] iocRegistrations). Dies würde es mir nicht wirklich erlauben, Generika von dem zu gebrauchen, was ich verstehe. – basicdays

1

Der Typ eines Objekts wird durch das Umwandeln nicht geändert. Es gibt also keine Möglichkeit festzustellen, ob ein Objekt für diesen oder jenen Typ bestimmt wurde. Es ist nur der Typ eines Ausdrucks, einer Variablen oder eines Felds, der den Zieltyp der Besetzung darstellt.

Das Beste, was Sie tun können, ist die Analyse der Methodenparameter oder Felder, um den Typ zu bekommen - aber das sollte wenig nutzen, da es statische Informationen zur Kompilierzeit verfügbar ist.

Und was ich mich die ganze Zeit wundere ... was zum Teufel willst du erreichen?

+0

Ha, ja, das ist eine gute Frage. Ich benutze derzeit sowohl CSLA als auch Castle Windsor. Meine Komponententests wurden mit den Support-Methoden, die ich schreiben musste, unausstehlich, nur um Mocks und Stubs in einen Service Locator zu setzen. Ich hatte gehofft, einen Testhelfer zu schreiben, der eine Liste von Objekten akzeptieren und sie nach dem Besetzungstyp registrieren konnte. Es kann sein, dass ich am Ende eine Registration-Klasse erstelle, die sowohl einen Typ als auch das zu registrierende Objekt enthält. – basicdays

Verwandte Themen